WWDC Quick Look 💓 By SwiftGGTeam
What's new in Photos

What's new in Photos

观看原视频

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

评论

GitHub Issues · utterances