iOS7、8、9系统新特性整理

iOS9系统 (2015年9月16日 发布iOS9.0正式版)

1
2
3
4
5
6
7
8
9
10
1.iPad多任务处理功能增强
2.3D Touch
3.搜索
4.游戏
5.app瘦身
6.支持从右到左的语言
7.应用传输安全(ATS)
8.扩展点
9.联系人和联系人UI
10.钥匙串

2.3D Touch

3D Touch为iOS 9用户提供了额外的交互维度。在支持的设备上,人们可以通过按应用程序图标从主屏幕快速选择特定于应用程序的操作。在应用程序中,人们可以使用各种压力来预览项目,在单独的视图中打开项目,以及访问相关的操作。

iOS9提供以下API:

1
2
3
4
5
6
7
8
9
10
11
1. 主屏幕快速操作API用于向应用程序图标添加快捷方式,以预测并加速用户与您的应用程序的交互
(请参阅UIApplicationShortcut * API,例如UIApplicationShortcutItem。)

2. 通过UIKit peek和pop API,您可以轻松访问应用程序中的其他内容,同时保持用户的上下文
(请参阅UIViewControllerPreviewing,UIViewControllerPreviewingDelegate
和UIViewController中的新方法)。使用peek快速动作API为您的应用程序的触摸并保持操作
提供按下启用的替换(请参阅UIPreview * API,例如UIPreviewAction和UIPreviewActionItem)。

3. Web视图查看和弹出API允许您启用HTML链接目标的预览(请参阅WKWebView)。

4. 通过UITouch强制属性,您可以向应用添加基于强制的基于用户的自定义交互。

3.搜索

在iOS 9中搜索为用户提供了访问应用内部信息的全新方式,即使未安装也是如此。当您搜索内容时,用户可以通过Spotlight和Safari搜索结果,切换和Siri建议访问应用程序深处的活动和内容。

iOS 9提供以下API以帮助您搜索内容:

1
2
3
4
5
6
7
8
9
10
11
12
1. NSUserActivity类包括新的方法和属性,可帮助您在用户执行应用程序中的活动时对项目
编制索引,例如访问导航点或创建和查看内容。

2. Core Spotlight框架(CoreSpotlight.framework)提供的API可帮助您将特定于应用
程序的内容添加到设备上的索引,并启用到应用程序的深层链接。

3. 通过Web标记,您可以搜索相关的Web内容,并帮助您丰富用户的搜索体验。要了解如何标记
您的网站,请参阅标记Web内容。

4. 通用链接允许您使用标准HTTP或HTTPS链接替换自定义URL方案。通用链接适用于所有用户:
如果用户安装了您的应用,该链接会将其直接带入您的应用;如果他们没有安装您的应用程序,
该链接将在Safari中打开您的网站。

通用连接

7.应用传输安全(ATS)

应用程序传输安全(ATS)在应用程序及其后端之间的安全连接中实施最佳实践。 ATS防止意外泄露,提供安全的默认行为,并且易于采用; 它在iOS 9和OS X v10.11中默认也是打开的。 无论您是创建新应用程序还是更新现有应用程序,都应尽快采用ATS。
如果您的应用需要向不安全的域发出请求,则必须在应用的Info.plist文件中设定此域。

9.联系人和联系人UI

iOS 9引入了 (Contacts.framework and ContactsUI.framework)来替换原先的 Address Book and Address Book UI 框架.

10.钥匙串

钥匙串提供更多关于新类型的加密密钥:

1
2
3
4
5
1. 访问控制列表的新约束,允许仅使用Touch ID或仅使用密码创建约束。
2. 新的Touch ID约束,在添加或删除指纹时使钥匙串项无效。
3. 使用访问控制列表的“应用程序密码”选项支持应用程序提供的钥匙串项加密熵。
4. 支持身份验证上下文,允许您与SecItem调用分开调用身份验证。
5. 支持使用kSecAttrTokenIDSecureEnclave属性在安全区域内生成和使用的密钥

iOS8系统 (2014年9月12日 发布iOS8.0正式版)

1
2
3
4
5
6
7
8
9
10
1.应用扩展 (App Extension)
2.Touch ID认证
3.照片
4.游戏
5.HealthKit Framework
6.HomeKit Framework
7.iCloud
8.Handoff
9.支持新的屏幕大小和比例
10.其他

1.应用扩展 (App Extension)

在Xcode中,您可以通过向应用添加预配置的应用扩展目标来创建应用扩展。用户安装包含扩展程序的应用程序后,用户可以在“设置”应用程序中启用该扩展程序。当用户运行其他应用程序时,系统会在适当的系统UI(例如“共享”菜单)中启用启用的扩展。

iOS支持以下区域的应用扩展:

1
2
3
4
5
6
分享
行动
日程安排
照片编辑
存储提供商
自定义键盘

2.Touch ID认证

在应用中添加Touch ID认证,当你需要保护应用中某些信息或者选项是,可以添加此功能进一步对用户的身份进行验证.

相关事例参考

3.照片

在您的应用中拍摄更好的照片,为照片应用提供新的编辑功能,并创建新的,更高效的工作流程,以访问用户的照片和视频资产。

Photos框架:(Photos.framework)提供了新的API,用于处理由照片应用管理的照片和视频资产,包括iCloud Photos资产。 该框架是资产库框架的更有效的替代方案。 主要功能包括一个线程安全的体系结构,用于获取和缓存缩略图和全尺寸资产,请求更改资产,观察其他应用程序所做的更改以及可恢复的资产内容编辑。

手动控制相机: AVFoundation framework (AVFoundation.framework)比以往任何时候都更容易拍出好照片。你的应用程序可以直接控制相机的对焦、白平衡和曝光设置。此外,您的应用程序可以使用括号内的曝光捕获自动捕获图像与不同的曝光设置。

6和6plus相机上新相机功能:

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
31
32
33
34
35
36
37
38
39
40
1.新属性(videoHDRSupported)可以确定捕获设备是否支持高动态范围流。
2.新的视频稳定模式(AVCaptureVideoStabilizationModeCinematic)为捕获的视频提供了更多的视频效果。
3.新属性(highResolutionStillImageOutputEnabled)设置一个AVCaptureStillImageOutput对象来捕捉高分辨率的静态图片。
4.新属性(autoFocusSystem)可以用来确定相机如何自动对焦。
```


#### 5.HealthKit

是一个用于管理用户健康相关信息的新框架。随着用于跟踪健康和健身信息的应用程序和设备的激增,用户很难清楚地了解他们的工作方式。 HealthKit使应用程序可以轻松共享与健康相关的信息,无论该信息来自连接到iOS设备的设备还是由用户手动输入。用户的健康信息存储在集中且安全的位置。然后,用户可以看到Health应用程序中显示的所有数据。

#### 6.HomeKit

是一个用于与用户家中的连接设备进行通信和控制的新框架。 家庭的新设备提供更多的连接和更好的用户体验。 HomeKit提供了与这些设备通信的标准化方法。


#### 7.iCloud

iCloud包括一些影响现有应用程序行为和影响这些应用程序用户的变化。

文档相关的数据迁移: 当在用户设备和服务器之间传输文档和数据时,iCloud基础架构更加强大和可靠。当用户安装iOS 8并使用iCloud帐户登录设备时,iCloud服务器会对该用户帐户中的文档和数据执行一次性迁移。此迁移涉及将文档和数据复制到应用程序容器目录的新版本。只有运行iOS 8或OS X v10.10的设备才能访问新容器。运行较旧操作系统的设备可以继续访问原始容器,但在该容器中所做的更改不会出现在新容器中,并且新容器中所做的更改不会出现在原始容器中。

CloudKit:(CloudKit.framework)是用于在您的应用和iCloud之间移动数据的渠道。与其他透明地进行数据传输的iCloud技术不同,CloudKit可让您控制何时进行传输。您可以使用CloudKit管理所有类型的数据。

文件选择器:文档选取器视图控制器(UIDocumentPickerViewController)授予用户对应用程序沙箱外部文件的访问权限。这是一种在应用程序之间共享文档的简单机制。它还支持更复杂的工作流程,因为用户可以使用多个应用程序编辑单个文档。

#### 8.Handoff

Handoff是OS X和iOS中的一项功能,可扩展用户跨设备连续性的体验。切换使用户能够在一个设备上开始活动,然后切换到另一个设备并在另一个设备上恢复相同的活动。例如,正在浏览Safari中的长篇文章的用户移动到登录到相同Apple ID的iOS设备,同一网页会自动在iOS上的Safari中打开,其滚动位置与原始设备上的滚动位置相同。 Handoff使这种体验尽可能无缝。



#### 9.支持新的屏幕大小和比例

iOS 8增加了新功能,使处理屏幕尺寸和方向更加通用。为您的应用创建一个适用于iPad和iPhone的单一界面比以往任何时候都更容易,根据需要调整方向更改和不同屏幕尺寸。使用大小类,您可以检索有关当前方向的设备大小的常规信息。您可以使用此信息来初步假设应显示哪些内容以及这些界面元素如何相互关联。


#### 10.其他

API现代化
  1. 在大多数类中,getter和setter方法都被属性替换。 使用现有getter和setter方法的代码继续使用此更改。
  2. 更新初始化方法,使其返回值为instancetype而不是id。
  3. 指定的初始化程序在适当时声明。

    1
    2
    3
    4
    5
    6
    7
    8

    AV Foundation框架:(AVFoundation.framework)使您可以在拍摄视频时随时捕获元数据。 可以在各个时间点通过视频记录嵌入任意类型的元数据。 例如,您可以在移动摄像机设备创建的视频中记录当前物理位置。

    AVKit框架(AVKit.framework)可支持在iOS上使用。 当您需要显示视频时,请使用它而不是去使用Media Player框架。

    新的CoreAudioKit框架简化了为利用应用程序间音频的应用程序创建用户界面所需的工作量。

    Core Image框架(CoreImage.framework)具有以下更改:
  4. 您可以在iOS中创建自定义图像内核。

  5. 核心图像检测器可以检测图像中的矩形和QR码。

    1
    2

    Core Location 框架(CoreLocation.framework) 具有以下更改:
  6. 如果设备位于多层建筑中,您可以确定该设备位于哪个楼层。

  7. 访问服务为需要用户访问的有趣地点位置信息的应用程序提供了重要的位置更改服务之外的另一种选择。

    1
    2

    Foundation 框架:
  8. NSFileVersion类提供对iCloud文档过去版本的访问。这些版本存储在iCloud中,但可以根据需要下载。

  9. NSURL类支持将文档缩略图存储为元数据。
  10. NSMetadataQuery类可以搜索应用程序打开的外部iCloud文档。
    1
    2
    3
    4



    ## iOS7系统 (2013年9月10日 发布iOS7.0正式版)

1.已禁用-[UIDevice uniqueIdentifier]
2.UIPasteboard由共享变为沙盒化了
3.MAC地址不能再用来识别设备
4.iOS现在要求app如需使用麦克风,需要征得用户同意
5.-[NSArray firstObject]的实现
6.增加了instancetype
7.设置UIImage的渲染模式:UIImage.renderingMode
8.tintColor VS barTintColor
9.去掉了纹理颜色
10.UIButtonTypeRoundRect被UIButtonTypeSystem取代了
11.检查无线路由是否可用
12.蜂窝网络
13.通过iCloud同步用户设备的密码
14.使用NSAttributedString显示HTML
15.使用原生的Base64
16.使用UIApplicationUserDidTakeScreenshotNotification来检查截图
17.实现多语言语音合成
18.使用了新的手势识别
19.使用UIScrollViewKeyboardDismissMode实现了Message app的行为
20.使用Core Image来检测眨眼以及微笑
21.给UITextView增加了链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

#### 1. 已禁用-[UIDevice uniqueIdentifier]

该方法在iOS5的时候已经被遗弃,在iOS7系统中完全禁用。Xcode5甚至不会允许你编译包含了指引到-[UIDevice uniqueIdentifier]的app。

此外,iOS7之前使用了-[UIDevice uniqueIdentifier] 的app如果在iOS7上运行,它不会返回设备的UUID,而是会返回一串字符串,以FFFFFFFF开头,跟着-[UIDevice identifierForVendor]的十六进制值。


#### 2. UIPasteboard由共享变为沙盒化了

UIPasteboard过去可以用来做app之间的数据分享。UIPasteboard本无问题,但是开发者开始使用它来存储标识符,和其他的相关app分享这些标识符的时候问题就出现了。有一个使用这种把戏的就是OpenUDID。

在iOS7中,使用 +[UIPasteboard pasteboardWithName:create:]和 +[UIPasteboard pasteboardWithUniqueName]创建剪贴板,而且只对相同的app group可见,这样就让OpenUDID不那么有用了。


### 3. MAC地址不能再用来识别设备

还有一个生成iOS设备唯一标示符的方法是使用iOS设备的Media Access Control(MAC)地址。一个MAC地址是一个唯一的号码,它是物理网络层级方面分配给网络适配器的。这个地址苹果还有其他的名字,比如说是硬件地址(Hardware Address)或是Wifi地址,都是指同样的东西。

有很多工程和框架都使用这个方法来生成唯一的设备ID。比如说ODIN。然而,苹果并不希望有人通过MAC地址来分辨用户,所以如果你在iOS7系统上查询MAC地址,它现在只会返回02:00:00:00:00:00。

现在苹果明确的表明你应该使用下面的方法来作为你应用的唯一标示符

NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];

NSString *identifierForAdvertising = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
每种方法都适配一种特别的用法:

IDFV 对供应商来说是唯一的一个值,由同一个公司发行的的app在相同的设备上运行的时候都会有这个相同的标识符。然而,如果用户删除了这个app然后再重新安装的话,这个标识符就会不一致。

advertisingIdentifier 会返回给在这个设备上所有软件供应商相同的一个值,所以只能在广告的时候使用。这个值会因为很多情况而有所变化,比如说用户初始化设备的时候便会改变。


### 4. iOS现在要求app如需使用麦克风,需要征得用户同意

以前如果app需要使用用户的位置,通讯录,日历,提醒以及照片,接受推送消息,使用用户的社交网络的时候需要征得用户的同意。现在在iOS7当中,使用麦克风也需要取得用户同意了。如果用户不允许app使用麦克风的话,那么需要使用麦克风的app就不能接收不到任何声音。


### 5.-[NSArray firstObject]的实现

-[NSArray firstObject]可能是Objective-C中被调用做多的API。firstObject的使用可以追溯到iOS4.0,但是那时是一个私有方法。在iOS7以前使用下面的方法

NSArray *arr = @[];
id item = [arr firstObject];
// iOS7之前你需要做以下工作
id item = [arr count] > 0 ? arr[0] : nil;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18


### 6.增加了instancetype

instancetype让iOS7API变得更加难懂。苹果改变了大部分 initializer和简易构造函数(convenience constructors),用instancetype代替id作返回类型。

1. ARC环境下:instancetype在编译期确定实例的类型,如果出现错误,在编译时就能提醒你,而不是在程序运行时发生崩溃。而使用id的话,编译期不检查类型, 运行时才检查类型。

2. MRC环境下:instancetype和id一样,不做具体类型检查

3. id可以作为方法的参数,但instancetype不可以

4. instancetype只适用于初始化方法和便利构造器的返回值类型,在调用子类方法时,使用它还可以省去对返回值的强制类型转换,编译器能够正确推断方法的返回值类型。


### 7.设置UIImage的渲染模式:UIImage.renderingMode

着色(Tint Color)是iOS7界面中的一个重大改变,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:

UIImageRenderingModeAutomatic // 根据图片的使用环境和所处的绘图上下文自动调整渲染模式。
UIImageRenderingModeAlwaysOriginal // 始终绘制图片原始状态,不使用Tint Color。
UIImageRenderingModeAlwaysTemplate // 始终根据Tint Color绘制图片忽略图片的颜色信息。

1
2
3
4
5
6

### 8. tintColor VS barTintColor

iOS7中你可以使用一个给定的颜色,甚至是记入颜色主题来给整个app着色,帮助你的app脱颖而出。设置app的tint color很简答,只要使用UIView的新属性tintColor即可。

这个属性是否听上去很熟悉呢?应该很熟悉,有些类,比如说UINaviagtionBar,UISearchBar,UITabBar以及UIToolbar已经有了这么命名的属性。他们现在有了一个新的属性:barTintColor。

UINavigationBar bar = self.navigationController.navigationBar;
UIColor
color = [UIColor greenColor];
if ([bar respondsToSelector:@selector(setBarTintColor:)]) { // iOS 7+
bar.barTintColor = color;
} else {
bar.tintColor = color;
}

1
2
3
4

### 9. 去掉了纹理颜色

iOS7不能再创建可以展现纹理的颜色。根据UIInterface.h文件中的注释,-[UIColor groupTableViewBackgroundColor]应该是要在iOS6当中即被删除了,但是它仅仅只是不像之前那样返回纹理颜色了。然而,以下的颜色在iOS7当中被删除了:

  • (UIColor *)viewFlipsideBackgroundColor;
  • (UIColor *)scrollViewTexturedBackgroundColor;
  • (UIColor *)underPageBackgroundColor;
    1
    2
    3
    4
    5
    6
    7
    8

    ### 11.检查无线路由是否可用

    定制一个视频播放器的能力在iOS版本每次的发布中一直有所进步。比如说,在iOS6之前,你不能在MPVolumeView中改变AirPlay的icon。

    在iOS7当中,你可以通过AirPlay,蓝牙或是其他的虚线机制了解是否有一个远程的设备可用。了解它的话,就可以让你的app在恰当的时候做恰当的事,比如说,在没有远程设备的时候就不显示AirPlay的icon。

    以下是新增加到MPVolumeView的新属性和推送

@property (nonatomic, readonly) BOOL wirelessRoutesAvailable; //是否有设备可以连接的无线线路?
@property (nonatomic, readonly) BOOL wirelessRouteActive; // 设备是否活跃
@property (nonatomic, strong) UIImage volumeWarningSliderImage;
NSString
const MPVolumeViewWirelessRoutesAvailableDidChangeNotification;
NSString *const MPVolumeViewWirelessRouteActiveDidChangeNotification;

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

### 12.蜂窝网络

在iOS7之前,是使用Reachability来检测设备是否连接到WWAN或是Wifi的。iOS7在这个基础上更进了一步,它会告诉你的设备连接上的是那种蜂窝网络,比如说是Edge网络,HSDPA网络,或是LTE网络。告诉用户他们连接上的是哪种网络可以优化用户体验,因为这样他们会知道网速如何,不会去请求需要高网速的网络请求。

这是CTTelephonyNetworkInfo的部分功能,它是CoreTelephony框架的一部分。iOS7还增加了currentRadioAccessTechnology属性和CTRadioAccessTechnologyDidChangeNotification到这个类。还有一些新的字符串常量来定义可能的值,比如说是CTRadioAccessTechnologyLTE。

### 13.通过iCloud同步用户设备的密码

iOS7以及Mavericks增加了iCloud Keychain来提供密码,以及iCloud中一些敏感数据的同步。开发者可以通过keychain中的kSecAttrSynchronizable key来遍历dictionary对象。

由于直接处理keychain比较难,封装库提供了一个简单的处理keychain的方法。SSKeychain封装库可能是最有名的的一个,现在它支持在iCloud同步


### 16.使用UIApplicationUserDidTakeScreenshotNotification来检查截图

在iOS7前,像Snapshot或是Facebook Poke这样的app是使用一些很精巧的方法来检测用户是否有截图。然而,iOS7提供一个新的推送方法:UIApplicationUserDidTakeScreenshotNotification。只要像往常一样订阅即可知道什么时候截图了。

注意:UIApplicationUserDidTakeScreenshotNotification 将会在截图完成之后显示。现在在截图截取之前无法得到通知。

### 17.实现多语言语音合成

iOS7加入了两个新类:AVSpeechSynthesizer 以及AVSpeechUtterance。这两个类可以给你的app发声。有多种语言可供选择。

使用这两个类给app提供语言合成的功能非常简单。AVSpeechUtterance 代表你想说什么,如何说。AVSpeechSynthesizer 用来发出这些声音,见以下代码片段:

AVSpeechSynthesizer synthesizer = [[AVSpeechSynthesizer alloc] init];
AVSpeechUtterance
utterance = [AVSpeechUtterance speechUtteranceWithString:@”Wow, I have such a nice voice!”];
utterance.rate = AVSpeechUtteranceMaximumSpeechRate / 4.0f;
// defaults to your system language
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@”en-US”];
[synthesizer speakUtterance:utterance];

1
2
3
4
5
6

### 18.使用了新的手势识别

UIScreenEdgePanGestureRecognizer 继承自UIPanGestureRecognizer ,它可以让你从屏幕边界即可检测手势。

使用新的手势识别器很简单,见以下:

UIScreenEdgePanGestureRecognizer *recognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:
@selector(handleScreenEdgeRecognizer:)];
recognizer.edges = UIRectEdgeLeft;
[self.view addGestureRecognizer:recognizer];

1
2
3
4
5
6

### 19.使用UIScrollViewKeyboardDismissMode实现了Message app的行为

像Messages app一样在滚动的时候可以让键盘消失是一种非常好的体验。然而,将这种行为整合到你的app很难。幸运的是,苹果给UIScrollView添加了一个很好用的属性keyboardDismissMode,这样可以方便很多。

这个属性使用了新的UIScrollViewKeyboardDismissMode enum枚举类型。这个enum枚举类型可能的值如下:

UIScrollViewKeyboardDismissModeNone // 滑动的时候不处理
UIScrollViewKeyboardDismissModeOnDrag // 开始滑动的时候消失
UIScrollViewKeyboardDismissModeInteractive // 键盘跟随拖动触摸屏幕,并可以再次向上拉以取消关闭

1
2
3
4

### 20.使用Core Image来检测眨眼以及微笑

iOS给Core Image增加了两种人脸检测功能:CIDetectorEyeBlink以及CIDetectorSmile。这也就是说你现在可以在照片中检测微笑以及眨眼。

UIImage image = [UIImage imageNamed:@”myImage”];
CIDetector
detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];

NSDictionary *options = @{ CIDetectorSmile: @YES, CIDetectorEyeBlink: @YES };

NSArray *features = [detector featuresInImage:image.CIImage options:options];

for (CIFaceFeature *feature in features) {
NSLog(@”Bounds: %@”, NSStringFromCGRect(feature.bounds));

if (feature.hasSmile) { 
    NSLog(@"Nice smile!"); 
} else { 
    NSLog(@"Why so serious?"); 
} 
if (feature.leftEyeClosed || feature.rightEyeClosed) { 
    NSLog(@"Open your eyes!"); 
} 

}
`

以上内容参考以下文章:

iOS7中容易被忽视的新特性