What's Available in iOS 13 SDK(Ver.2024)

盼望着,盼望着,东风来了,秋天的脚步近了。随着 Xcode 16 的即将发布,Xcode 最低 Debug 版本也被限制到了 iOS 13+。运气好的一部分 iOSer 终于可以在工程里把 minimum deployment target 设置到 iOS 13,在 iOS 13 发布 5 年后,终于迎来了 iOS 13 SDK。

不同于以往,5 年前的 WWDC 19 发布了众多的次时代炫酷框架。并且得益于 Swift @backDeployed 等相关特性,近五年新发布的一些功能,诸如 Concurrency、viewIsAppearing,也能在 iOS 13 发布之后也能陆续向前被兼容。

本文将会梳理截止目前(2024 年 8 月),升级到 iOS 13 SDK 后,作为一个普通的 iOS 开发者,终于能够用上的实用框架和功能简介。

SwiftUI

不必说,SwiftUI 算是 WWDC 19 上没有之一的最明星的框架了。5 年来相信大家对它也有所耳闻。

不过令人遗憾的是,SwiftUI 是随着系统发布,并且与系统绑定的。因此历代系统中有的一些 SwiftUI bug 只能通过升级系统的方式来解决。并且每年 SwiftUI 框架中新发布的功能,也只能在新系统上用上。

除此之外,一些比较基础的能力,如惰性布局容器 LazyV/HStack 和 @StateObject,在 iOS 14 中才提供,而导航 API 在 iOS 16 中有一次大的重构(NavigationView -> NavigationStack)。其实比较建议在更高版本系统上再开始使用 SwiftUI(如 iOS 15/16+)。在低版本系统中尽量还是使用与 UIKit 桥接的方式,在个别简单控件中桥接使用 SwiftUI。

资料推荐:

Combine

Combine 是与 SwiftUI 一同发布的另一个强大框架,是一个类似于 RxSwift 的 Reactive 框架。

Combine 比 RxSwift 有以下优势:

  • 性能更好:据测试,Combine 比 RxSwift 的综合性能提升了约 30%
  • 深度集成:得益于是系统层面的框架,Combine 与其他系统框架有更深度的集成,比如 SwiftUI 的部分 API,可以直接与 Combine 集成
  • 包体积:在全面切到 Combine 之后,也可以弃用 RxSwift,减少包体积
  • Debug 更直观:作为系统库,可以直接隐藏堆栈,减少无效堆栈的展示
  • 依赖方便:在 Demo 中使用 Reactive 功能时,可以考虑直接使用 Combine 而不用单独为项目引入 RxSwift 了

Combine 与 RxSwift 的不同:

  • 规范不同:RxSwift 实现的是 ReactiveX 规范,Combine 实现的是 Reactive Stream 规范
  • Back-Pressure:Combine 独有的功能,可以设置 subscriber 收到的流速。
  • 实践中比较大的不同:
    • subscribe 之后,RxSwift 如果不持有 Disposable,可以正常继续订阅;Combine sink 之后,必须持有 AnyCancellable,否则订阅就会立刻失效(类似 KVO)。

需要注意的是,Apple 在 WWDC 23 上发布了 Observation框架,在绝大多数 SwiftUI 场景已经可以不用 Combine 了。不过遗憾的是 Observation 要求 iOS 17+。

资料推荐:

Concurrency

3 年前的 WWDC 21 上,随着 Swift 5.5 的发布,async/await 语法终于来到了 Swift 。并且虽然框架发布之初只支持 iOS 15+,但是在框架正式发布的最后时刻向前兼容到了 iOS 13+。

但是 Swift Concurrency 并不仅仅是 async/await 语法,并不仅仅解决了回调地狱的问题,还解决了数据竞争(Actor/Sendable)和**结构化**并发(Task/TaskGroup)的问题。

数据竞争可以帮助我们摆脱麻烦的锁和线程等传统资源竞争处理方式,类似 Rust 的从编译期避免各类数据竞争问题;结构化并发则可以帮助我们更高效优雅地开启并发任务。

资料推荐:

Macro

去年的 WWDC 23 上,Swift 5.9 引入了一个重大更新:Swift 宏,并且向前兼容到了 iOS 13+。与 C 宏最大的不同是,C 宏只是简单的字符串替换,而 Swift 宏在设计时就考虑了以下几个原则:

  • Distinctive use sites:一眼就能看出是不是一个宏(必须带上 # 或 @)
  • Complete, type-checked, validated:宏的入参和结果都会进行类型检查
  • Inserted in predictable ways:宏只能添加代码,不能改变或删除
  • Macros are not magic Macros:可以展开宏、给宏打断点、编译失败时,可以看到具体错误位置

最早,必须通过 SPM 使用 Macro,后来也有人研究出可以通过 CocoaPods 使用的方式,参考:Distributing a Swift Macro using CocoaPods

资料推荐:

New in UIKit

UIKit 这些年每年都有新的 API,并且有的 API 向前兼容到了 iOS 13+,列举一些比较有用的:

Refs: iOS 13: Notable UIKit Additions | Swiftjective-C

Other Frameworks

  • Core Haptics:支持更精细的振动,可以像播放音乐一样完全自定义振动
  • SF Symbol:系统内置图标库
  • CryptoKit:生成哈希值、加解密数据、数字签名等等,可以参考介绍文章
相关推荐
songgeb15 小时前
YYImage Bug:一行之差,正常 JPEG 如何在 iOS 被读成条纹
ios·swift
fthux17 小时前
Tick Rest,一个休息提醒工具的自我修养
macos·开源·swift
茶底世界之下1 天前
阴天花摊不必变暖:用 Awaking 留住花色与湿街
ios·app·产品
Fatbobman(东坡肘子)1 天前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
chaoahyl2 天前
WaterDiary 喝水记录 App 实战(2)· 实现喝水首页与本地保存
swift
茶底世界之下2 天前
斜光下的旧自行车:用 Awaking 留一版复古胶片色
ios·app·产品
2501_916008892 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
茶底世界之下3 天前
iPhone Duo 适配实战,Awaking 踩过的 8 个坑
ios·swiftui·swift
跨境数据猎手3 天前
HTTP 响应体编码与压缩:识别、解码
网络协议·http·ios
也非非也3 天前
iPhone 中国区 AI 落地:Apple 与阿里千问合作的技术观察
大数据·人工智能·ios·agent·iphone·智子