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和NSURLRequestReloadIgnoringLocalAndRemoteCacheDataAPI现已可用。 -
从 iOS 13 beta 4 开始,强制执行
NSMutableURLRequest的HTTPBodyStream属性的copy操作。如果在调用属性设置器后对body数据进行了修改,则HTTP请求中发送的数据将不包含该更变。调用该属性的getter不再返回NSMutableData引用,即使使用该类型的数据调用setter也是如此。从 iOS 13 beta 5 开始,使用 iOS 12 SDK 或以前的 SDK 构建的应用程序使用旧版行为。 -
CNCopyCurrentNetworkInfoAPI 返回的信息已无法反映真实情况。有关更多详细信息,请参阅更新的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 通道编码视频。以这种方式编码的视频在AVFoundationAPI 和网页中的 Safari 中得到广泛支持。格式的技术细节可以在互操作性配置文件规范中找到。
Core Image
-
filterWithImageURL:options:和filterWithImageData:options:不再支持 RAW 5 及更早版本。版本 6 及更高版本仍然受支持。 -
添加了用于实例化和修改内置
Core Image过滤器的新 API。 -
增强了
CICoreMLModel过滤器以支持具有MLFeatureTypeMultiArray类型的输入或输出的模型。 -
Metal CIKernel实例支持具有任意结构化数据的参数。 -
Metal CIKernel实例支持返回一组2×2像素。 -
CIFormat符号的整数值(例如kCIFormatARGB8)已更改为跨平台一致性的新值集合。以前的值仍然支持向后兼容; 但是,您应该避免对特定数值的依赖性。
- 现在可以在“设置”>“邮件”中启用“忽略已阻止的发件人”。被阻止的联系人列表与 Messages,FaceTime 和 Phone 共享。
小结
从开发层面来讲,iOS 13 最大的亮点无疑是引入了SwiftUI,这也是 WWDC 2019 的一大亮点。实际上 Release Note 也是大篇幅在讲 SwiftUI的内容。由于SwiftUI还处理优化阶段,变数还很多,所以我们在此暂不说明,详情可以查看iOS 13 Release Note。
另外由于 Apple 在未发布 iOS 13 正式版时,就开始发布 iOS 13.1 beta 版,所以有些内容可能已不适用。在 iOS 13.1 正式版出来后,我们再细细来看。
iOS13带来了多项针对开发者的更新,包括API变更、新特性介绍及弃用API的注意事项等。新版本强调了SwiftUI的重要性,同时也对UIKit、网络、音频等方面进行了改进。
4183

被折叠的 条评论
为什么被折叠?



