一、证书管理
在Xcode8之前,都需要自己设置证书和描述文件。如果设置出现错误的情况下,还可以通过点击Fix issue来修复这个错误。但这有个问题就在于,Fix issue选项并不是那么好用,有的时候设置是正确的这里也提示需要Fix issue。
在Xcode8中可以通过Automatically manage signing选项,让苹果为我们管理证书和配置文件,设置也都是由苹果来完成的。在Xcode8中新建项目,这个选项默认是被勾选的。Xcode会自动替你生成调试证书和描述问题,证书与描述文件有效期为6天,避免了大量的垃圾冗余证书占用问题。
1、未设置证书前
2、设置证书后
注:从上面图中可以看到,苹果帮我们自动管理了证书和配置文件。而且在之前的项目中,如果想要设置安装后显示在手机上的App名字,还需要自己到Info.plist文件中,修改Display Name字段,而现在直接在General中就可以做修改,这个修改和Info.plist是同步的。
3、手动管理证书
如果想自己管理证书和描述文件,只需要去掉Automatically manage signing选项;
二、XIB和Storeboard适配
在Xcode8之前,创建一个XIB或SB文件,都是一个600*600的方块XIB文件。在Xcode8之后,创建的XIB文件默认是6s尺寸的大小。
但是Xcode8打开之前旧项目的XIB或SB文件时,会弹出下面的弹框, 这时候一般直接选择Choose Device即可。
之后大家会发现布局啊,frame乱了,只需要更新一下frame即可。如下图
但是这样有个问题,如果Xcode8打开过这个XIB文件,并选择Choose Device之后。其他的Xcode8以下版本的编译器,将无法再打开这个文件,会报以下错误:
The document “ViewController.xib” requires Xcode 8.0 or later. This version does not support documents saved in the Xcode 8 format. Open this document with Xcode 8.0 or later.
解决办法: 右击XIB或SB文件 -> Open as -> Source Code,删除xml文件中下面一行字段。
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
三、编译错误
1、nullable
之前一些泛型相关的修饰符,nullable之类的有的会报错。
例如:
UIWebView的代理方法,要删除NSError前面的 nullable,否则报错。
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error
{
[self hideHud];
}
2、CAAnimation及其子类
CAAnimation及其子类,设置代理属性后,必须在@interface()遵守代理,否则报错。
#四、Xcode插件
升级Xcode8之后会发现,在Xcode8中所有第三方插件都失效了,并且连之前菜单栏的插件选项也不存在了。在之前很多iOS开发者,都是通过Alcatraz来管理插件的,现在Alcatraz也是不可用的。但是Xcode8自身也对编译器进行了升级,将一些比较好的插件功能加入到Xcode中,例如单行高亮显示等。
在Xcode8中支持了开发插件工程,并且为我们提供了一个插件模板,开发的插件可以上传到App Store下载。苹果这么做有一个原因在于,之前Xcode和插件是运行在同一个进程的,所以插件的崩溃也会导致Xcode崩溃。苹果现在将插件作为一个单独的应用程序,分开进程运行,不会对Xcode带来其他影响。
Xcode8内置了开启注释的功能:在Xcode8中可以将光标放在方法上面,通过option + command + /快捷键生成文档注释。
位置:
快捷键的设置:
五、权限适配
在iOS10之后需要在Info.plist中,添加新的字段获取权限,否则在iOS10上运行会导致崩溃。
1、麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风?
2、相机权限: Privacy - Camera Usage Description 是否允许此App使用你的相机?
3、相册权限: Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库?
4、通讯录权限: Privacy - Contacts Usage Description 是否允许此App访问你的通讯录?
5、蓝牙权限:Privacy - Bluetooth Peripheral Usage Description 是否许允此App使用蓝牙?
6、语音转文字权限:Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别?
7、日历权限:Privacy - Calendars Usage Description 是否允许此App使用日历?
8、定位权限:Privacy - Location When In Use Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据
9、定位权限: Privacy - Location Always Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据
六、推送
苹果的推送在之前iOS8和iOS9的时候就发生过大的更新,推送功能越来越强大。在iOS10之后苹果推出了UserNotifications框架,可以通过这个框架更好的控制推送通知,可以更新、修改锁屏页面的推送消息,可以添加图片等功能。
但是在用Xcode8打包后,并且不对代码进行修改的情况下,会发现打包后苹果发来了一封邮件。这封邮件大概意思是如果需要使用推送通知,需要对代码做修改,否则将不能使用推送通知。
iOS 10以后
添加库
#import <UserNotifications/UserNotifications.h>
遵循推送的代理
<UNUserNotificationCenterDelegate>
iOS10收到通知不再是在[application: didReceiveRemoteNotification:]方法去处理, iOS10推出新的代理方法,接收和处理各类通知(本地或者远程)。
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
//应用在前台收到通知
NSLog(@"========%@", notification);
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
//点击通知进入应用
NSLog(@"response:%@", response);
}
七、删除系统log
升级Xcode8之后,在调试和运行过程中,发现控制台打印了很多不认识的log,这些log是系统打印的,和开发者没关系。
subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
解决方法:在Target -> Edit Scheme -> Run -> Arguments中,添加OS_ACTIVITY_MODE字段,并设置为Disable即可。