Media & Web 进阶 20m
照片选择器新特性
What's new in the Photos picker
2022年6月6日
一句话判断
系统照片选择器新增截图/录屏过滤、复合过滤逻辑、并且扩展到了 macOS 和 Mac Catalyst——如果你的应用需要访问照片,PHPicker 仍然是最佳方案。
这场 Session 讲了什么
Photos 团队的 Justin 介绍了系统照片选择器在 2022 年的改进。照片选择器运行在独立进程中,应用无需请求照片库权限即可使用。今年的更新包括新的资产类型过滤器、复合过滤逻辑、以及对 macOS 和其他框架的支持扩展。
值得深挖的点
新增资产类型过滤器。除了原有的图片、视频、Live Photo 之外,新增了截图、录屏、慢动作视频等过滤类型。还可以通过 PHAsset.PlaybackStyle 创建自定义过滤器。Cinematic 视频、景深照片和连拍照片是 iOS 16 独占的过滤类型,其他新增类型都回溯支持到 iOS 15。
复合过滤逻辑。原来只有”任意”(any)组合过滤器,今年新增了”全部”(all)和”排除”(not)。比如”显示所有图片但排除截图”这样的组合现在可以一步实现。
平台扩展。照片选择器现在支持 macOS 和 Mac Catalyst,API 保持一致。Safari Web Extensions 也可以调用照片选择器。
向后兼容策略。大部分新过滤器即使应用目标是 iOS 15,只要用 iOS 16 SDK 编译就能使用。这意味着不需要提高最低部署目标就能获得新功能。
代码片段
// 截图过滤器
var filter = PHPickerFilter.images
// 显示所有图片但排除截图
let noScreenshots = PHPickerFilter.images.subtracting(.screenshots)
config.filter = noScreenshots
// 复合过滤器:视频和 Live Photo
config.filter = .any(of: [.videos, .livePhotos])
// Cinematic 视频(仅 iOS 16+)
if #available(iOS 16, *) {
config.filter = .cinematicVideos
}
// 基础配置
var config = PHPickerConfiguration()
config.filter = .screenshots // 只显示截图
config.selectionLimit = 0 // 多选
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
present(picker, animated: true)
最佳实践
- 使用系统照片选择器而非自定义实现,避免请求照片库权限
- 利用复合过滤器精确控制用户可选内容,减少无关选项
- 编译 SDK 升级到 iOS 16 可以免费获得大部分过滤器的向后兼容
- 多平台应用共享同一套 PHPicker API
- 选择结果的异步加载(PHPickerResult)避免一次性加载大量图片数据
还有什么值得关注
- PHPicker 的独立进程架构确保应用无法访问用户的完整照片库
- Safari Web Extensions 中也可以调用照片选择器,扩展了 Web 应用的能力
- 新的过滤类型覆盖了截图、录屏等常见用户需求场景
WWDC 2022