iOS 13 已正式发布,网上对其用户体验上的新特性的描述也不少。对于开发来讲,须要关注的另外一方面是新系统在 API 层面作了哪些改动,从而会对咱们现有的代码产生什么影响。算法
在这里,咱们基于 iOS 13 Release Notes 作了一些整理,主要是列表出 Apple 提供的一些新的 API 和弃用了哪些 API,一块儿来看看安全
• iOS 13 再也不支持 UIApplicationExitsOnSuspend
。须要更新应用以处理现代多任务处理。服务器
• 当单元格突出显示或选中时,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,请在搜索控制器变为活动状态以前设置此属性。app
• UIRefreshControl
类再也不直接修改其滚动视图的 contentInset
。 相反,它对内容插入的调整将合并到滚动视图的 adjustContentInset
中。 惟一的例外是当滚动视图的 contentInsetAdjustmentBehavior
设置为 UIScrollViewContentInsetAdjustmentNever
时,在这种状况下,UIRefreshControl 实例将像之前的版本同样直接修改 contentInset
。框架
• 若是经过覆盖 sizeThatFits
在 UITableView 中实现自调整单元格而不使用自动布局,则返回的高度将被解释为单元格的 contentView 所需的高度,UITableViewCell 会自动添加为单元格留出空间所需的任何其余高度 分隔器。若是以这种方式实现手动自调整大小,则在 UITableViewCell 上调用 sizeThatFits: 时,单元格的 contentView 宽度能够保证准确,以便在手动布局计算中使用。ide
• Trait环境(例如视图和视图控制器)如今在初始化期间使用 traits 填充 traitCollection
属性。这些初始特征表示特征环境在添加到层次结构时将接收的最终特征的预测。由于在初始化期间填充的特征只是一个预测,它们可能与实际在层次结构中接收的特征不一样。所以,在可能的状况下,您应该等待执行使用 traitCollection 的工做,直到视图或视图控制器的视图移动到层次结构中 - 意味着窗口返回非零值 - 这样您就没必要丢弃任何工做,若是实际特征不一样,则使用预测的特征完成。使用 traitCollection
的最佳时间是在布局期间,例如 layoutSubviews,viewWillLayoutSubviews 或 viewDidLayoutSubviews 内部。布局
• 只有当特征值发生变化时,才会调用 traitCollectionDidChange:
方法。重要的是,因为特征集合如今初始化为目标层次结构中最终特征的预测,当初始预测特征与层次结构中的最终特征匹配时,特征环境添加到层次结构时将不会调用 traitCollectionDidChange:
。由于 traitCollectionDidChange: 旨在做为无效回调来通知您一个或多个特征已更改,请审核此方法的现有实现,以及 UIContentContainer 方法willTransitionToTraitCollection:withTransitionCoordinator:
,用于您可能依赖它的地方触发初始设置。懒惰地执行使用 traitCollection 的工做的最佳位置是在上面讨论的 layoutSubviews 方法之一,但请记住,这些布局方法在任什么时候候布局都会被调用,因此必定要避免在不须要时重复工做。优化
• 您如今能够启用调试日志记录,以便在您本身的类上调用 traitCollectionDidChange:
或willTransitionToTraitCollection:withTransitionCoordinator:
时。使用如下启动参数打开日志记录:-UITraitCollectionChangeLoggingEnabled YES
。您可能但愿在使用此启动参数并从 Xcode 运行应用程序时暂时禁用主线程检查程序,以免为不相关的类添加额外的日志消息。ui
• 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 如今支持使用 HEVC
和 Alpha 通道编码视频。以这种方式编码的视频在 AVFoundation API 和网页中的 Safari 中获得普遍支持。格式的技术细节能够在互操做性配置文件规范中找到。
• 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 正式版出来后,咱们再细细来看。
更多好文,请关注公众号
知识小集
(ID:zsxjtip
)