Highlight
iOS 14 为 PhotoKit 增加 Limited Photos Library,用户可以只授权选中的照片和视频,App 需要通过新的授权状态、访问级别和管理 UI 适配受限照片库。
核心内容
过去,很多 App 只想让用户上传头像、发送一张照片,或者把图片插进文档,却会弹出完整照片库权限请求。用户一旦同意,App 通过 PhotoKit 看到的是几乎整个照片库。个人照片库常常有几万甚至几十万张照片和视频,这个权限范围远大于很多功能真正需要的范围。
iOS 14 在这个权限模型中加入了 Limited Photos Library。用户可以选择 “Select Photos”,然后在系统界面里挑出允许某个 App 访问的照片和视频。对 App 来说,这个选择会像过滤器一样作用在 PhotoKit API 上:PHAsset.fetchAssets 只能返回用户选中的资源,相关元数据也只限于这些资源。
这个变化会影响所有使用 PhotoKit 的 App,包括已经发布、还没有采用新 API 的 App。未适配的 App 在首次通过 PhotoKit 抓取资源时,系统会在每个 App 生命周期中提示一次,让用户保留或修改当前选择。适配后的 App 可以自己决定何时展示管理界面,并把入口放在照片浏览、导入或设置页面里。
Apple 给出的迁移方向很明确。头像上传、聊天发图、文档插图这类一次性选择流程,应该优先使用新的 PHPickerViewController,因为它不要求照片库访问权限。只有照片浏览、编辑、相机、备份这类以照片库为核心的 App,才需要认真处理 limited 状态下的 UI、授权查询和资源变化。
详细内容
查询 limited 授权状态
(08:36)iOS 14 给 PHAuthorizationStatus 增加了 .limited,并新增 PHAccessLevel。limited 只影响读写访问,所以查询时要传入 .readWrite,再检查返回值是否为 .limited。
import Photos
let accessLevel: PHAccessLevel = .readWrite
let authorizationStatus = PHPhotoLibrary.authorizationStatus(for: accessLevel)
switch authorizationStatus {
case .limited:
print("limited authorization granted")
default:
//FIXME: Implement handling for all authorizationStatus values
print("Not implemented")
}
关键点:
PHAccessLevel区分.addOnly和.readWrite,对应照片权限中的添加和读写两类访问。- 需要检查 limited 状态时,示例使用
.readWrite,因为 limited library 不影响 add-only 访问。 authorizationStatus(for:)是访问级别感知的新查询 API。- 旧的授权状态 API 出于兼容原因不会返回
.limited;用户给的是有限照片库访问时,旧 API 仍会返回 authorized。
请求读写访问
(09:43)请求授权也增加了访问级别参数。演讲建议让用户操作驱动权限请求,例如用户点击导入照片、读取相册或保存到相机胶卷时再触发,让系统弹窗和用户当前任务对齐。
import Photos
let requiredAccessLevel: PHAccessLevel = .readWrite
PHPhotoLibrary.requestAuthorization(for: requiredAccessLevel) { authorizationStatus in
switch authorizationStatus {
case .limited:
print("limited authorization granted")
default:
//FIXME: Implement handling for all authorizationStatus
print("Unimplemented")
}
}
关键点:
requestAuthorization(for:)只会在授权状态尚未确定时弹出系统权限请求。- 回调里的
authorizationStatus会反映用户刚刚做出的选择。 .limited表示用户授予了有限照片库访问,App 应该调整 UI,让用户知道当前只能看到选中的照片和视频。- 在 limited 模式下,大部分 PhotoKit API 的行为和完整授权相同,但可见资源范围被用户选择过滤。
处理 limited 模式的资源边界
(10:57)演讲列出几个 intentional exceptions。App 新创建的资源会自动加入该 App 的有限选择中;用户相册不能被抓取或创建;Cloud Shared Assets 和 shared albums 也不可访问。依赖 App 专属相册的产品,需要调整行为。
关键点:
- 保存新照片的功能仍然可用,新创建的 asset 会进入当前 App 的可见选择。
- 如果现有流程依赖创建用户相册,limited 模式下不能继续沿用这个设计。
- 共享照片资源不可见,备份、整理、聚合类 App 要在 UI 中解释缺失范围。
PHPhotoLibraryChangeObserver仍然重要,因为用户可能在系统设置、管理界面或 iCloud 同步场景中改变可见资源。
主动展示管理界面
(12:04)适配 limited 模式后,App 可以用 presentLimitedLibraryPicker(from:) 主动展示系统管理界面。演讲建议把它绑到上下文明确的按钮或动作上,例如照片浏览页的管理入口。
import PhotosUI
let library = PHPhotoLibrary.shared()
let viewController = self
library.presentLimitedLibraryPicker(from: viewController)
关键点:
PHPhotoLibrary.shared()取得共享照片库对象。viewController是管理界面要从哪里展示出来。presentLimitedLibraryPicker(from:)会打开系统的有限照片库管理 UI,让用户增减当前 App 可访问的照片和视频。- 采用这个入口后,可以在 Info.plist 中设置 Prevent Limited Photos Access Alert,让系统不要在 App 首次调用 PhotoKit API 时自动弹出管理提示。
核心启发
-
做一个有限照片库状态条:在照片浏览页顶部显示当前处于有限访问,并提供管理入口。为什么值得做:用户只选了少量照片时,空白网格容易被误解为 App 读取失败。怎么开始:用
PHPhotoLibrary.authorizationStatus(for: .readWrite)检查.limited,再用presentLimitedLibraryPicker(from:)打开系统管理界面。 -
把头像上传改成 PHPicker 流程:头像、封面、聊天图片这类单次选择功能不再请求 PhotoKit 读写权限。为什么值得做:session 明确说这些功能可以用 PHPicker 完成,用户无需授予完整照片库访问。怎么开始:把旧的权限请求入口换成
PHPickerViewController,选中结果进入 App 后再保存到自己的业务数据中。 -
给照片编辑器做 limited 模式空状态:当用户只授权几张照片时,编辑器提示用户添加更多可编辑照片,而不是显示通用错误。为什么值得做:PhotoKit API 会像照片库中只有这些资源一样返回结果,App 需要用 UI 解释资源范围。怎么开始:进入资源列表前查询
.limited,列表为空或数量很少时提供管理选择按钮。 -
调整相册依赖功能:把“创建 App 专属相册”改成 App 内收藏夹、项目列表或导出记录。为什么值得做:演讲说明 limited 模式下不能抓取或创建用户相册。怎么开始:把相册结构保存在 App 自己的数据层,PhotoKit 只负责读取用户授权的 asset 和保存新创建的资源。
-
监听选择变化并刷新缓存:用户在设置或管理界面修改选择后,照片列表、缩略图缓存和编辑队列应同步更新。为什么值得做:session 说明用户修改选择时 App 会收到通知。怎么开始:继续使用
PHPhotoLibraryChangeObserver,在 change 回调中重新计算当前可见资源集合。
关联 Session
- Meet the new Photos picker — 直接讲解
PHPickerViewController,是本 session 推荐的免权限照片选择方案。 - Build trust through better privacy — 从 iOS 14 的隐私透明度和用户控制角度解释这类权限变化的背景。
- Support local network privacy in your app — 同样围绕 iOS 14 权限提示,适合对照设计用户触发、理由清晰的授权流程。
- What’s new in location — 展示位置权限在 iOS 14 中的精度和授权变化,可帮助理解隐私权限的 UI 适配思路。
评论
GitHub Issues · utterances