Xcode8和iOS10新特性

Xcode 8和 iOS10 新特性

Interface Builder

在Xcode8中,苹果推出了更加强大的可视化编辑工具以及预览功能,可以在不运行App的情况下,预览当前XIB或SB在不同屏幕尺寸下的显示。选择一个XIB文件进去,点击下面红框的位置,会出现从3.5寸-5.5存一系列屏幕的选项。 直接点击不同屏幕尺寸,以及横竖屏,切换不同的屏幕显示。在iPad上还可以选择是否分屏。

Interface Builder

新创建的XIB控件尺寸,不再是之前600*600的方块了,而是默认是6s的长方形XIB文件

Swift 2 和 3

在Xcode 8之前,Xcode的每一个版本都是内置明确版本的swift编程语言。在Xcode 8中就不同了。因为Swift 3有了大量的改变,而且大多数改变是具有破坏性的。
使用Xcode 8创建默认使用的Swift 3。幸运的是Xcode 8中的building setting选项可以让开发者明确表明继续使用Swift 2和Swift 2.3。
Swift
如果不想立刻就迁移到Swift 3,可以在Builder Setting中进行设置,选择Use Legacy Swift Language Version设置为YES,就可以继续使用就版本的Swift2.3。

Xcode插件

升级Xcode8之后会发现,Xcode8中所有第三方插件都失效了,并且连之前菜单栏的插件选项也不存在了。在之前很多iOS开发者,都是通过Alcatraz来管理插件的,现在Alcatraz也是不可用的。但是Xcode8自身也对编译器进行了升级,将一些比较好的插件功能加入到Xcode中,例如单行高亮显示等。
在Xcode8中支持了开发插件工程,并且为我们提供了一个插件模板,开发的插件可以上传到App Store下载。苹果这么做有一个原因在于,之前Xcode和插件是运行在同一个进程的,所以插件的崩溃也会导致Xcode崩溃。苹果现在将插件作为一个单独的应用程序,分开进程运行,不会对Xcode带来其他影响。
然后选择 Editor -> add a new Target。选择 Xcode Source Editor Extension 并创建,然后你会得到一个询问是否切换到扩展 scheme 的提示,选择切换。

Xcode插件

Runtime Issues

在iOS开发过程中,因为语法错误或者缺少头文件,编译器可以发现并报黄色或红色警告。但一些代码逻辑导致的错误(循环引用),编译器并没有办法找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#import "ViewController.h"
typedef void (^completionBlock)();
@interface ViewController ()
@property (nonatomic, weak) completionBlock completionblock;
@property (nonatomic, copy) NSString *name;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 1.Buildtime提示ARC Retain Cycle错误
self.completionblock = ^{
self.name = @"jason";
};
//2.Runtime Issues提示内存泄漏
NSMutableArray *arr1 = [NSMutableArray array];
NSMutableArray *arr2 = [NSMutableArray array];
[arr1 addObject:arr2];
[arr2 addObject:arr1];
}

通过Xcode8提供的Runtime Issues新特性,查找到运行过程中出现的问题,并通过Graph的方式将问题可视化的展现给开发者。
Runtime Issues新特性

内存调试–Debug Memory Graph

Xcode 8用相当强大的内存调试器来跟踪内存的泄漏和循环。点击如下图所示红色方框的图标,然后在左边区域选择一个对象,查看与其相关的内存关系。
Debug Memory Graph新特性

Debug Memory Graph和Runtime Issues可以配合使用,通过Debug Memory Graph分析内存关系完成后,点击Runtime Issues可以看到已经发现的内存问题。

代码签名

在Xcode8之前,都需要自己设置证书和描述文件。如果设置出现错误的情况下,还可以通过点击Fix issue来修复这个错误。但这有个问题就在于,Fix issue选项并不是那么好用,有的时候设置是正确的这里也提示需要Fix issue。

在Xcode8中可以通过Automatically manage signing选项,让苹果为我们管理证书和配置文件,设置也都是由苹果来完成的。在Xcode8中新建项目,这个选项默认是被勾选的。打勾以后,Xcode为你管理certificates, provisioning profiles和 application identifiers。
代码签名

编译错误

升级Xcode之后,Xcode8对之前的一些修饰符和语句不兼容,会导致一些编译错误。

  • 1.一些泛型相关的修饰符,nullable之类的有的会报错。
  • 2.CAAnimation及其子类,设置代理属性后,必须在@interface()遵守代理,否则报错,等等。

控件错位或者不显示问题

在使用view.frame之前需要调用如下的语句:

1
[self.view layoutIfNedded]

来更新frame值,不然frame的宽和高都是1000

Info.plist增加权限字段

Xcode8构建的app,在使用相册、相机等权限时会崩溃。错误信息:

1
2
This app has crashed because it attempted to access privacy-sensitive data without a usage description.
The app's Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

官方文档解释:

1
2
3
Important: To protect user privacy, an iOS app linked on or after iOS 10.0, and which accesses the user’s photo library, must statically declare the intent to do so. Include the NSPhotoLibraryUsageDescription key in your app’s Info.plist file and provide a purpose string for this key. If your app attempts to access the user’s photo library without a corresponding purpose string, your app exits.
必须在Info.plist文件中增加NSPhotoLibraryUsageDescription键,并且填入合适的描述文本

下面是一些常用的字段,如果有缺少的麻烦各位评论区补充一下。
权限字段

UITableView、UICollectionView生命周期适配

这章WWDC介绍了UITableView和UICollectionView的生命周期在iOS10中发生了改变。

在iOS9及之前,一个UICollectionViewCell被重用的过程是这样的:

  • 一个cell即将出现的屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • willDisplayCell
  • ……
  • 一个cell完全离开屏幕
  • didEndDisplayCell
  • 进入reuse queue

但在iOS10中,一个UICollectionViewCell被重用的过程变成了这样:

  • 一个cell还没出现在屏幕上
  • prepareForReuse
  • cellForItemAtIndexPath
  • 一个cell即将出现的屏幕上
  • ……
  • 一个cell完全离开屏幕
  • didEndDisplayCell
  • 一段时间后再进入reuse queue

所以,iOS10后,cellForItemAtIndexPath被调用时,并不表示这个cell即将要出现在了屏幕上。还是得老老实实使用willDisplayCell和didEndDisplayCell方法。

系统log

升级Xcode8之后,在调试和运行过程中,发现控制台打印了很多不认识的log,这些log是系统打印的,和开发者没关系。但是这么多log看着比较乱,怎么屏蔽掉呢?

1
com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

在Product -> Scheme -> Edit Scheme -> Run -> Arguments中或者使用快捷键⌘ + >,添加OS_ACTIVITY_MODE字段,并设置为Disable即可
删除系统log

推送通知

苹果的推送在之前iOS8和iOS9的时候就发生过大的更新,推送功能越来越强大。在iOS10之后苹果推出了UserNotifications框架( 具体可以看瞄神的博客UserNotifications框架 ),可以通过这个框架更好的控制推送通知,可以更新、修改锁屏页面的推送消息,可以添加图片、视频等功能。
在Xcode8之后,如果需要使用Push Notifications的功能,需要勾选Capabilities -> Push Notifications为YES,否则进行远程推送就会有问题
推送通知

其他更新

1.Xcode 8不允许开发人员安装插件,Xcode 8中集成了一些常用的插件。

  • 1.1 在Xcode 8中将光标放在方法上面,通过option + command + / 生成文档注解
  • 1.2 被编辑的行高亮显示
  • 1.3 集成KSImageNamed功能

2.Xcode新版字体,SF Mono Regular字体
3.最新版的API文档样式

参考文献:
Xcode 8 带来的新特性和坑
Xcode8 中的新内容

感谢!我会继续努力,谢谢!