# IOS11新特性

## 一 新增框架

新加入SDK的大的框架有两个，分别是负责简化和集成机器学习的 Core ML 和用来创建增强现实 (AR) 应用的 ARKit。

### Core ML

1.机器学习

机器学习是一种人工智能，计算机会“学习”而不是被明确编程。不用编写算法，机器学习工具通过在大量数据中寻找模式，使计算机能够开发和优化算法。

神经网络尝试用节点层来模拟人脑流程，并将节点层用不同的方式连接在一起。GPU 来处理会非常有效。GPU 成本的下降使我们能够创建多层深度神经网络，此为深度学习。

训练模型意味着给神经网络提供训练数据，并让它计算公式，此公式组合输入参数以产生输出。训练是离线的，通常在具有多个 GPU 的机器上。

要使用这个模型，就给它新的输入，它就会计算输出：这叫做推论。推论仍然需要大量计算，以从新的输入计算输出。因为有了 Metal 这样的框架，现在可以在手持设备上进行这些计算。

机器学习模型的训练是一项很重的工作，Core ML 所扮演的角色更多的是将已经训练好的模型转换为 iOS 可以理解的形式，并且将新的数据“喂给”模型，获取输出。Apple 提供了一系列的工具用来将各类机器学习模型转换为 Core ML 可以理解的形式。这样就可以轻松地在 app 里使用前人训练出的模型。

2.iOS对机器学习的支持

iOS 5 里引入了 NSLinguisticTagger 来分析自然语言。iOS 8 出了 Metal，提供了对设备 GPU 的底层访问。去年，在 Accelerate 框架添加了 Basic Neural Network Subroutines (BNNS)，使开发者可以构建用于推理（不是训练）的神经网络。iOS11 提供了 Core ML 和 Vision。

* Core ML 让我们更容易在 App 中使用训练过的模型。支持神经网络、树组合、支持向量机、广义线性模型、特征工程和流水线模型。
* Vision 让我们轻松访问苹果的模型，用于面部检测、面部特征点、文字、矩形、条形码和物体。还可以在 Vision 模型中包装任意的图像分析 Core ML 模型。

Core ML 在背后驱动了 iOS 的视觉识别的 Vision 框架和 Foundation 中的语义分析相关 API。普通开发者可以从这些高层的 API 中直接获益，比如人脸图片或者文字识别等。这部分内容在以前版本的 SDK 中也存在，不过在 iOS 11 SDK 中它们被集中到了新的框架中，并将一些更具体和底层的控制开放出来。

### ARKit

ARKit 极大降低了普通开发者玩 AR 的门槛，也是 Apple 现阶段用来抗衡 VR 的选项。ARKit 是一套并不很复杂的 API。涉及的 View 几乎是作为 SceneKit 的延伸，再加上在真实世界的定为也已经由系统帮助处理，开发者需要做的大抵就是将虚拟物体放在屏幕的合适位置，并让物体之间互动。

## 二 Xcode

### 编辑器和编译器

速度就是生命，而开发者的生命都浪费在了等待编译上。Xcode 9 中编辑器进行了重写，支持了对 Swift 代码的重构，将 VCS 提到了更重要的位置，并添加了 GitHub 集成，可以进行同局域网的无线部署和调试。

新的编译系统是使用 Swift 重写的，编译速度有了提升。Xcode 9 中的索引系统也使用了新的引擎。

### Named Color

现在你可以在 xcassets 里添加颜色，然后在代码或者 IB 中引用这个颜色了。颜色进行替换时只需要在 xcassets 里改一下，就能反应到代码和IB的所有地方了。

## 三 其他值得注意的变更

列举一下剩下的小变化。

* 拖拽 - 可以对任意 UIView 子类定义拖拽行为.
* 新的 Navigation title 设计 - iOS 11 的大多数系统 app 都采用了新的设计，放大了导航栏的标题字体。app可以设置 navigation bar 的 prefersLargeTitles 来使用同样的设计。
* FileProvider 和 FileProviderUI - 提供一套类似 Files app 的界面，可以获取用户设备上或者云端的文件。
* 不再支持 32 位 app - 虽然在 beta 1 中依然可以运行 32 位 app，但是 Apple 明确指出了将在后续的 iOS 11 beta 中取消支持。
* DeviceCheck - 每天要用广告 ID 追踪用户的开发者现在有了更好地选择。DeviceCheck 允许通过服务器与 Apple 服务器通讯，并为单个设备设置两个 bit 的数据。简单说，在设备上用 DeviceCheck API 生成一个 token，然后将这个 token 发给自己的服务器，再由自己的服务器与 Apple 的 API 进行通讯，来更新或者查询该设备的值。这两个 bit 的数据可以用来追踪用户行为。
* PDFKit - 这是一个在 macOS 上已经长期存在的框架，但却在 iOS 上姗姗来迟。可以使用这个框架显示和操作 pdf 文件。
* IdentityLookup - 可以自己开发一个 app extension 来拦截系统 SMS 和 MMS 的信息。系统的信息 app 在接到未知的人的短信时，会询问所有开启的过滤扩展，如果扩展表示该消息应当被拦截，那么这则信息将不会传递给你。扩展有机会访问到事先指定的 server 来进行判断 (可以光明正大地获取用户短信内容了，不过这些访问都是匿名加密的，Apple 也禁止这类扩展在 container 里进行写入)。
* Core NFC - 在 iPhone 7 和 iPhone 7 Plus 上提供基础的近场通讯读取功能。只要你有合适的 NFC 标签，手机就可以进行读取
* Auto Fill - 从 iCloud Keychain 中获取密码，然后自动填充的功能现在开放给第三方开发者了。UITextInputTraits 的 textContentType 中添加了 username 和 password，对适合的 text view 或者 text field 的 content type 进行配置，并填写 Info.plist 的相关内容，就可以在要求输入用户名密码时获取键盘上方的自动填充，帮助用户快速登录。
