iOS 13 已正式发布,网上对其用户体验上的新特性的描述也很多。对于开发来说,需要关注的另一方面是新系统在 API 层面做了哪些改动,从而会对我们现有的代码产生什么影响。
在这里,我们基于 iOS 13 Release Notes 做了一些整理,主要是列表出 Apple 提供的一些新的 API 和弃用了哪些 API,一起来看看
General
? iOS 13 不再支持 UIApplicationExitsOnSuspend。需要更新应用以处理现代多任务处理。
UIKit
? 当单元格突出显示或选中时,UITableViewCell 类不再更改 contentView 及其任何子视图的 backgroundColor 或 opaque 属性。如果要在 contentView 内部(包括)内容的任何子视图上设置不透明的 backgroundColor,则单元格突出显示或选中时的外观可能会受到影响。解决子视图任何问题的最简单方法是确保将 backgroundColor 设置为 nil 或 clearColor,并且设置它们的 opaque 属性为 false。但是,如果需要,您可以重写 setHighlighted:animated: 和 setSelected:animated: 方法,以便在移动到突出显示的状态和选定状态时手动更改子视图上的这些属性。
? 从iOS 8开始,将 UISearchController 与 UINavigationController 一起使用需要将顶视图控制器的 definesPresentationContext 属性设置为 true。如果不这样做会导致难以检测和调试的细微错误。从 iOS & iPadOS 13 beta 开始,如果视图控制器的 navigationItem 具有 non-nil 搜索控件,当视图控制器显示在导航控制器中时,UINavigationController 会自动将该视图控制器的 definesPresentationContext 属性设置为 true。如果您要定位早期版本的 iOS,请在搜索控制器变为活动状态之前设置此属性。
? UIRefreshControl 类不再直接修改其滚动视图的 contentInset。 相反,它对内容插入的调整将合并到滚动视图的 adjustContentInset 中。 唯一的例外是当滚动视图的 contentInsetAdjustmentBehavior 设置为 UIScrollViewContentInsetAdjustmentNever 时,在这种情况下,UIRefreshControl 实例将像以前的版本一样直接修改 contentInset。
? 如果通过覆盖 sizeThatFits 在 UITableView 中实现自调整单元格而不使用自动布局,则返回的高度将被解释为单元格的 contentView 所需的高度,UITableViewCell 会自动添加为单元格留出空间所需的任何其他高度 分隔器。如果以这种方式实现手动自调整大小,则在 UITableViewCell 上调用 sizeThatFits: 时,单元格的 contentView 宽度可以保证准确,以便在手动布局计算中使用。
? Trait环境(例如视图和视图控制器)现在在初始化期间使用 traits 填充 traitCollection 属性。这些初始特征表示特征环境在添加到层次结构时将接收的最终特征的预测。因为在初始化期间填充的特征只是一个预测,它们可能与实际在层次结构中接收的特征不同。因此,在可能的情况下,您应该等待执行使用 traitCollection 的工作,直到视图或视图控制器的视图移动到层次结构中 - 意味着窗口返回非零值 - 这样您就不必丢弃任何工作,如果实际特征不同,则使用预测的特征完成。使用 traitCollection 的最佳时间是在布局期间,例如 layoutSubviews,viewWillLayoutSubviews 或 viewDidLayoutSubviews 内部。
? 只有当特征值发生变化时,才会调用 traitCollectionDidChange: 方法。重要的是,由于特征集合现在初始化为目标层次结构中最终特征的预测,当初始预测特征与层次结构中的最终特征匹配时,特征环境添加到层次结构时将不会调用 traitCollectionDidChange:。因为 traitCollectionDidChange: 旨在作为无效回调来通知您一个或多个特征已更改,请审核此方法的现有实现,以及 UIContentContainer 方法willTransitionToTraitCollection:withTransitionCoordinator:,用于您可能依赖它的地方触发初始设置。懒惰地执行使用 traitCollection 的工作的最佳位置是在上面讨论的 layoutSubviews 方法之一,但请记住,这些布局方法在任何时候布局都会被调用,所以一定要避免在不需要时重复工作。
? 您现在可以启用调试日志记录,以便在您自己的类上调用 traitCollectionDidChange: 或willTransitionToTraitCollection:withTransitionCoordinator: 时。使用以下启动参数打开日志记录:-UITraitCollectionChangeLoggingEnabled YES。您可能希望在使用此启动参数并从 Xcode 运行应用程序时暂时禁用主线程检查程序,以避免为不相关的类添加额外的日志消息。
? UITableViewCell 类的 contentView 属性始终与前面和后面的相邻附件进行边对边布局。这简化了布局代码,因此想要正确的默认偏移的开发人员不再需要将其内容与内容视图边框或布局边距对齐,具体取决于尾部是否有附件。您现在应该始终在单元格内容视图的布局边距上布置代码以获取默认的系统插入。这些插入将根据单元格中可见的附件自动调整,以匹配系统的默认间距。
? 您现在可以从创建 block 调用自定义初始化程序,该创建块通过 instantiateInitialViewController(creator:) 或 instantiateViewController(identifier:creator:) 传递。这使您可以使用其他上下文和参数初始化视图控制器,同时利用通过 Interface Builder 在故事板中定义它们。自定义控制器初始化程序必须调用其 super.init(coder:) 方法并传递它通过创建块接收的编码器参数。
网络
? 为了增强安全性,当服务器发送 Content-Type:application/octet-stream 时,NSURLSession 不再嗅探 MIME 类型。
? NSURLRequestReloadRevalidatingCacheData 和 NSURLRequestReloadIgnoringLocalAndRemoteCacheData API现已可用。
? 从 iOS 13 beta 4 开始,强制执行 NSMutableURLRequest 的 HTTPBodyStream 属性的 copy 操作。如果在调用属性设置器后对 body 数据进行了修改,则 HTTP 请求中发送的数据将不包含该更变。调用该属性的 getter 不再返回 NSMutableData 引用,即使使用该类型的数据调用 setter 也是如此。从 iOS 13 beta 5 开始,使用 iOS 12 SDK 或以前的 SDK 构建的应用程序使用旧版行为。
? CNCopyCurrentNetworkInfo API 返回的信息已无法反映真实情况。有关更多详细信息,请参阅更新的API文档和标题。
? 包含 body 的 GET HTTP 方法的所有 NSURLSessionTask 实例现在都会抛出错误 NSURLErrorDataLengthExceedsMaximum。
? 删除了对代理自动配置(PAC)的 FTP 和文件URL方案的支持。HTTP 和 HTTPS 是 PAC 唯一支持的 URL 方案。这会影响所有 PAC 配置,包括但不限于使用“设置”,“系统偏好设置”,“配置文件”和 NSURLSession API(如connectionProxyDictionary 和CFNetworkExecuteProxyAutoConfigurationURL)设置的配置。
? NSURLSession 和 NSURLConnection API 不再支持 SPDY。服务器应使用 HTTP 2 或 HTTP 1.1。
音频
? 现在可以在 AVAudioEngine 上启用语音处理模式。
? 新的 AVAudioNode 类型可用于包装用户定义的 block,以实时发送或接收数据。
? 基于 AVAudioEngine 的应用程序可以使用一种新方法来检索附加到 AVAudioEngine 实例的所有节点的列表。
? AVAudioEnvironmentNode 中的新渲染模式基于输出设备自动选择最佳空间音频渲染算法。
? 一个新的 AVAudioSession 属性允许在会话主动使用音频输入时播放系统声音和触觉。
? 新的枚举 AVAudioSessionPromptStyle 根据系统中的其他音频活动通知应用程序应该播放哪种语音提示。
? AVAudioSessionRouteSharingPolicy 现在允许应用指定路由共享策略,以便其音频和视频路由到与 AirPlay 相同的位置。
? Audio Unit Extensions 现在支持所有宿主应用程序中可用的用户预设。
? OpenAL框架已弃用,出于兼容性目的暂时保留。过渡到 AVAudioEngine 以获得 3D 音频功能。
? AUGraph 已被弃用,转而支持 AVAudioEngine。
? 不推荐使用应用间音频。使用 Audio Units 支持此功能。
? 不推荐使用基于 Carbon 的 Audio Units,在将来的版本中不再支持。
? 不再支持旧版 Core Audio HAL 音频硬件插件。将音频服务器插件用于支持音频驱动程序。
音频共享
? 音频共享与 AirPods(第1代或更高版本)和 PowerBeats Pro 兼容。需要 iPhone 8 或更高版本。
AVFoundation
? AVFoundation 现在支持使用 HEVC 和 Alpha 通道编码视频。以这种方式编码的视频在 AVFoundation API 和网页中的 Safari 中得到广泛支持。格式的技术细节可以在互操作性配置文件规范中找到。
Core Image
? filterWithImageURL:options: 和 filterWithImageData:options: 不再支持 RAW 5 及更早版本。 版本 6 及更高版本仍然受支持。
? 添加了用于实例化和修改内置 Core Image 过滤器的新 API。
? 增强了 CICoreMLModel 过滤器以支持具有 MLFeatureTypeMultiArray 类型的输入或输出的模型。
? Metal CIKernel 实例支持具有任意结构化数据的参数。
? Metal CIKernel 实例支持返回一组2×2像素。
? CIFormat 符号的整数值(例如 kCIFormatARGB8)已更改为跨平台一致性的新值集合。以前的值仍然支持向后兼容; 但是,您应该避免对特定数值的依赖性。
Mail ? 现在可以在“设置”>“邮件”中启用“忽略已阻止的发件人”。被阻止的联系人列表与 Messages,FaceTime 和 Phone 共享。