Highlight
WWDC25 在 PhotoKit 引入新的编辑节点链与场景过滤能力,让第三方 App 可以直接复用系统级的视觉理解结果。
核心内容
照片类 App 的老大难是「选图」。用户图库里塞着几千张照片,让人翻完一个滚动列表本来就是负担,App 还要再让用户从这些照片里挑出一张「适合做封面」或「带食物的」,体验只会更糟。开发者过去常见的做法,是在选图后再跑一次本地的视觉分析,先把无关照片过滤掉,再交给后续流程。代价是设备发热、电量掉得快,分析逻辑还要自己维护。
WWDC25 这场 session 给的解法,是把系统已经计算好的分类结果开放给开发者使用。系统在照片入库时就跑过场景识别、人脸聚类、文字识别这些分析,这些结果以前只有「为你推荐」「记忆」等系统功能能用,现在 PhotoKit 把入口下放到第三方 App。选图阶段可以让 PHPicker 只显示某类场景的照片;编辑阶段则用新的节点链描述「我要做什么」,由系统决定调度。整套思路是把「计算」和「决定执行方式」拆开。
详细内容
PHPicker 的 API 形态保持不变,开发者依然用 PHPickerViewController 拉起选择器,差别在于 PHPickerConfiguration 上多了配置项,可以告诉系统「只展示符合某类筛选条件的照片」。最基本的用法仍然是:
import PhotosUI
import SwiftUI
struct PhotoPickerExample: View {
@State private var selection: [PhotosPickerItem] = []
var body: some View {
PhotosPicker(
selection: $selection,
maxSelectionCount: 5,
matching: .images
) {
Label("选择照片", systemImage: "photo.on.rectangle")
}
}
}
关键点:
PhotosPicker是 SwiftUI 对 PHPicker 的包装,selection绑定一个[PhotosPickerItem]数组用于回写选择结果。maxSelectionCount限定上限;不传就是单选。matching:接受PHPickerFilter,决定选择器里展示的内容类型,最常用的是.images、.videos、.livePhotos。在新版本里这个过滤器可以叠加更细的条件,比如限定来源相册或限定为屏幕截图。
照片库读写仍然走 PHPhotoLibrary。请求权限和注册变更通知是两件不同的事,新版本鼓励把变更监听切到基于 Observable 的接口,让 SwiftUI 视图能直接订阅图库变化,避免手写 PHPhotoLibraryChangeObserver 的样板代码。
import Photos
func requestLibraryAccess() async -> PHAuthorizationStatus {
await PHPhotoLibrary.requestAuthorization(for: .readWrite)
}
关键点:
requestAuthorization(for:)用async形式拿权限状态,免去回调嵌套。- 传
.readWrite表示需要读写权限;只读场景传.addOnly或.readWrite中较弱的一个,按需要选。 - 返回值是
PHAuthorizationStatus枚举,处理时关注.authorized、.limited、.denied三种状态——limited模式下用户只授权了部分照片,App 仍能工作但能看到的资源更少。
编辑流程用 PHAssetChangeRequest 修改资源元数据,用 PHContentEditingOutput 写入编辑结果。新的节点链架构是在这两套 API 之上的描述层,把「先裁剪再调色再加滤镜」这种线性步骤组织成可独立调整的节点,避免「改中间一步要从头重算」的问题。
核心启发
-
做什么:用 PhotoKit 的场景过滤替代自研图像分类
- 为什么值得做:系统已经在设备上算好了分类,复用一次零成本;自己跑模型既费电又要维护。
- 怎么开始:先列出 App 里所有需要按场景过滤的入口,例如「上传食物图」「选风景作壁纸」,把这些入口的 picker 配置切到系统过滤。
-
做什么:用节点链重构多步图片编辑
- 为什么值得做:用户对「撤销中间一步」「禁用某个滤镜」的预期很高,老的线性 output 模型撑不起这种交互。
- 怎么开始:找一个最复杂的编辑路径(通常是「裁剪+调色+滤镜+水印」),先把它迁到节点链,验证撤销链路;其它路径再分批跟进。
-
做什么:把
PHPhotoLibraryChangeObserver切到 Observable 接口- 为什么值得做:改动量小、风险低,但能让 SwiftUI 视图天然响应图库变化,减少 App 在后台时的无效刷新。
- 怎么开始:搜代码里所有
PHPhotoLibraryChangeObserver的实现,把它们包装成@Observable类型暴露给视图层,逐步替换。
-
做什么:在 picker 配置上写死「最少够用」的过滤条件
- 为什么值得做:默认 picker 会让用户翻全部图库,加合理的初始过滤能直接缩短关键路径。
- 怎么开始:每个调用
PhotosPicker的位置 review 一遍matching:参数,按业务语义补全。
关联 Session
- Enhancing your camera experience with capture controls — 让相机界面接入物理按键和系统级捕获控制。
- Enhance your app with machine-learning-based video effects — 用机器学习给视频加帧率转换、超分辨率与降噪。
- Capture cinematic video in your app — 通过 Cinematic Video API 录制电影级视频。
- Read documents using the Vision framework — 用 Vision 的新
RecognizeDocumentsRequest做结构化文档识别。 - What’s new in RealityKit — 把图片素材引入 3D 场景的新工作流。
评论
GitHub Issues · utterances