xcode8 ios10 新特性使用总结

好多人都更新了Xcode8 那么随之而来的就是Xcode8的一些变化以及使用时的一些注意事项了,我用了一段时间,做了一些总结现在分享给大家。

xcode8 使用总结:

1、新建工程:在Xcode 创建项目的时候新增了iMessage 信息应用程序 和 sticker 表情包应用程序,并且将开发者账号的管理提到 创建项目参数配置中

1.内置表情包(Sticker Packs)

可以通过在Xcode中新建Sticker Pack Application来创建。这种方式可以简单地通过添加图片来在iMessage中添加表情包。添加的贴纸需要满足一下条件图片类型必须是 png、apng、gif或者jpeg

文件大小必须 小于500K

具体如何实现可以查看这篇文章:http://codecloud.net/13065.html

2.iMessage应用(没有具体研究过怎么用)

iMessage app使用完整的框架和Message app进行交互。使用iMessage app能够在消息应用内呈现一个自定义的用户交互界面。 使用MSMessagesAppViewController创建一个自定义或者动态的表情包浏览器。使用 MSStickerBrowserViewController添加文本、表情、或者媒体文件到消息应用的文本输入框。使用 MSConversation创建带有特定的应用数据交互的消息。使用 MSMessage更新可以相互影响的消息(例如,创建游戏或者可以合作的应用)。

2、在Xcode general 配置中有比较大的变化

3、Xcode8重新设计了Interface Builder 的画布,不再有以前的大方框了,取而代之的是选择不同设备,你可以在不同设备之间快速切换并看到一个完全实时的应用程序界面预览

在底部设备栏(暂且这么叫)右边你会看到一个 Vary for Traits按钮 点开之后你可以选择宽度和高度,当选中Width的时候左侧会列出所有需要适配的屏幕类型,包括分屏,竖屏和横屏.这样你就会很容易的知道我的界面需要适配的所有宽度类型.

同理:当选中Height的时候左侧会列出所有需要适配的屏幕类型,包括分屏,竖屏和横屏.这样你就会很容易的知道我的界面需要适配的所有高度类型.

4、关于Interface Builder版本问题

当用Xcode8打开之前创建的项目的xib的时候回跳出让你选择设备的界面,如果你选择了那么再用Xcode8以下的版本就打不开了,也就是说Xcode7、Xcode6等等都无法使用。情况如下

Xcode7、Xcode6等等再次打开xib就会报错

怎么解决呢,一种方法就是我们打开Xcode8的时候选择cancel

如果不小心已经选择了choose怎么办呢,别急,我们用另外一种方法,另一种方法可以选中xib右击选择Open As ->Source Code 然后在xml文件中你会看到这句话

只需要将这句话删除就可以了

5、控制台输出Log问题

Xcode8会在控制台打印一些额外信息(猜想是个BUG),如果这样的话就太影响开发调试了,不过我们也可以关闭,但是关闭的话真机测试又没有信息打印了,而且每一个项目我们都得这样配置,所以这是一个很蛋疼的问题。但是没办法,目前还没有找到好的解决办法,有的人可能出现配置了但是还是输出这些乱七八糟的信息,这样我们就得多试几遍了,确实没有办法,但是现在升级到xcode8.1版本的话苹果就已经解决了这个bug了.

如何配置呢:

1、快捷键 cmd + shift +, 或者使用下面的方法

2、选择完或者执行快捷键会出现下面的窗口,做如下配置OS_ACTIVITY_MODE -> Disable

6、添加注释

虽然Xcode8禁用了所有的插件,如果想继续使用插件请参考这篇文章:http://www.jianshu.com/p/86dcccaec4c3/comments/4283432 ,不过Xcode8也内部集成了一些插件使用,比如添加说明(注释): Option + CMD + /,不过会遇到不启动的情况

解决方案:

打开终端,命令运行: sudo /usr/libexec/xpccachectl

然后必须重启电脑就大功告成了

如果这里是灰色的 说明你的添加注释功能被禁用了

7、ios10 隐私权限设置

iOS 10 开始对隐私权限更加严格,如果你不设置就会直接崩溃,现在很多遇到崩溃问题了,一般解决办法都是在info.plist文件添加对应的Key-Value就可以了。

• 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风?

• 相机权限: Privacy - Camera Usage Description 是否允许此App使用你的相机?

• 相册权限: Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库?

• 通讯录权限: Privacy - Contacts Usage Description 是否允许此App访问你的通讯录?

• 蓝牙权限:Privacy - Bluetooth Peripheral Usage Description 是否许允此App使用蓝牙?

• 语音转文字权限:Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别?

• 日历权限:Privacy - Calendars Usage Description

• 定位权限:Privacy - Location When In Use Usage Description

• 定位权限: Privacy - Location Always Usage Description

• 位置权限:Privacy - Location Usage Description

• 媒体库权限:Privacy - Media Library Usage Description

• 健康分享权限:Privacy - Health Share Usage Description

• 健康更新权限:Privacy - Health Update Usage Description

• 运动使用权限:Privacy - Motion Usage Description

• 音乐权限:Privacy - Music Usage Description

• 提醒使用权限:Privacy - Reminders Usage Description

• Siri使用权限:Privacy - Siri Usage Description

• 电视供应商使用权限:Privacy - TV Provider Usage Description

• 视频用户账号使用权限:Privacy - Video Subscriber Account Usage Description

如果配置这些不起作用的话就需要打开后台权限,拿定位来说的话如下图

8、推送问题

如果大家要使用推送请将这个打开,不然会出现问题的

9、iOS9 中默认非HTTPS的协议是被禁止的,解决方案是我们可以在info.plist文件中添加AppTransportSecuritySettings字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS。

iOS10 从2017年1月1日起苹果提出所有新提交的App默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。

解决方案:我们可以通过NSExceptionDomains设置白名单的方式来针对特定的域名开放HTTP内容来通过审核。可以简单理解成,把不支持https协议的接口设置成http的接口。

操作:

1)在项目info.plist中添加一个Key:App Transport Security Settings,类型为

Dictionary;

2)在其内添加一个Key: Exception Domains,类型为Dictionary;

3)在Exception Domains内添加要支持的域,其中域作为Key,类型为Dictionary;

4)每个域下面需要设置3个属性:类型为Boolean;

NSIncludesSubdomains  YES

NSExceptionRequiresForwardSecrecy  NO

NSExceptionAllowsInsecureHTTPLoads  YES

注意:每个需添加的域都需要设置此三个属性。如果请求的网络图片是HTTP,也是需要设置的图片的域。

10、系统判断方法失效

在你的项目中,当需要判断系统版本的话,不要使用下面的方法:

#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10)

它会永远返回NO,substringToIndex:1

在iOS 10 会被检测成 iOS 1了,应该使用下面的这些方法:Objective-C 中这样写:

#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Swift中这样写:

if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) { // 代码块}

11、苹果针对内存也做了优化,Xcode8新增Runtime调试,界面可以展示运行时的问题,改善的界面调试对于调试不清晰或者不满意的布局变的更简单,我们可以利用debug模式下的Runtime来查看内存,具体如何实现我也没有做过实验,可以参考一下这篇文章http://url.cn/40SBiZq

12、Swift3.0 and Swift2.3 随意切换

Xcode8支持3.0语法和2.3语法随意切换,默认创建出来是3.0语法, 如果想用2.3语法是可以切换的

语法转换

当然Swift只能向上兼容,不能向下兼容,如果你的语法是2.3的可以转换为3.0的,但是转换不一定成功

推荐阅读更多精彩内容