WWDC Quick Look 💓 By SwiftGGTeam
Handle the Limited Photos Library in your app

Handle the Limited Photos Library in your app

观看原视频

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

评论

GitHub Issues · utterances