Privacy & Security 进阶 20m
隐私功能的新更新
What's new in privacy
2023年6月5日
一句话判断
今年的隐私更新围绕”减少权限请求”展开——嵌入式 Photos Picker 不需要相册权限、屏幕共享 Picker 不需要录屏权限、日历新增”仅添加”权限——如果你的 App 还在请求全量权限,现在是时候重新设计了。
这场 Session 讲了什么
Session 介绍了 Apple 平台在 2023 年的隐私增强,围绕四大隐私支柱展开:数据最小化、设备端处理、透明度与控制、安全保护。
Photos Picker 增强:
- iOS 17 和 macOS Sonoma 中,Photos Picker 可以完全嵌入 App 内——看起来像是 App 的一部分,但实际由系统渲染。
- 三种嵌入模式:无装饰全屏、单行横向滚动、内联完整选择器。
- 新增选项菜单,控制是否共享照片元数据(标题、位置等)。
- App 只能获取用户选择的图片,不需要请求整个相册的访问权限。
- iOS 17 还重新设计了完整相册权限对话框——展示照片数量和样本预览。
- 系统会定期提醒用户哪些 App 有完整相册访问权限。
Screen Capture Picker(macOS):
- 新的
SCContentSharingPickerAPI(ScreenCaptureKit)。 - App 不需要获取录屏权限——系统代为展示窗口选择器,用户选择后才共享。
- macOS Sonoma 新增屏幕共享菜单栏图标,提醒用户有 App 在录屏。
- 点击图标可以预览共享内容、添加/移除窗口、或结束共享。
日历权限改进:
- 如果 App 只需要创建日历事件,使用 EventKitUI 不需要任何权限。
- 新增”仅添加”日历权限——App 可以添加事件但不能读取现有事件。
- 需要完整日历访问时可以请求升级,建议在用户明确意图时才请求。
空间计算的隐私设计:
- 空间输入模型设计上保护隐私——App 不直接访问传感器数据,通过系统 API 获取所需信息。
- 摄像头和传感器数据在系统层面处理,App 只获得必要的最小信息。
值得深挖的点
嵌入式 Photos Picker 的设计哲学是”看起来像 App 的一部分,但实际由系统控制”。照片在视觉上融入你的 App UI,但渲染和选择过程完全在系统层面完成。用户选择的照片才会传递给 App。这种设计平衡了用户体验(无缝的视觉感受)和隐私保护(App 无法偷偷浏览整个相册)。
日历的”仅添加”权限填补了一个长期存在的空白。很多 App(如餐厅预订、演唱会购票)只需要往日历添加事件,但之前必须请求完整的日历读写权限。用户看到”访问你的日历”的提示时可能会拒绝——App 就无法添加事件了。现在有了仅添加权限,这类 App 可以在不读取任何日历数据的情况下添加事件。
屏幕共享菜单栏图标是 macOS Sonoma 的一个重要安全信号。之前用户授权录屏后很容易忘记某个 App 还在录制屏幕。新的常驻图标提供了持续的可视提醒,点击可以快速查看和终止共享。这对视频会议 App 的用户来说是一个重要的安全感提升。
代码片段
嵌入式 Photos Picker 的三种模式:
import PhotosUI
// 模式1:单行横向滚动选择器
PhotosPicker(selection: $selectedItems,
matching: .images) {
// 最小化展示——一行可滚动的缩略图
}
// 模式2:内联完整选择器
// 使用新的嵌入式 API,Photos Picker 看起来是 App UI 的一部分
// 但由系统渲染和控制
// 选项菜单:控制元数据共享
var config = PhotosPickerConfiguration()
config.selection = .ordered
config.selectionLimit = 5
// 用户可以在选择时控制是否共享位置、标题等元数据
Screen Capture Picker(macOS):
import ScreenCaptureKit
// 使用新的 SCContentSharingPicker
// 不需要预先获取录屏权限!
let picker = SCContentSharingPicker.shared
// 展示窗口选择器
picker.showPicker(for: .init()) { result in
switch result {
case .success(let content):
// 用户选择了要共享的窗口或屏幕
// 只有这个内容会被录制
startCapture(with: content)
case .failure:
// 用户取消了选择
break
}
}
// 系统菜单栏会显示屏幕共享图标
日历的仅添加权限:
import EventKit
// 方式1:使用 EventKitUI 创建事件——不需要任何权限
let eventVC = EKEventEditViewController()
eventVC.eventStore = eventStore
eventVC.event = newEvent
present(eventVC, animated: true)
// 系统渲染 UI,App 不需要日历访问权限
// 方式2:请求仅添加权限
let status = EKEventStore.authorizationStatus(for: .event)
if status == .notDetermined {
// 新的仅添加权限
let granted = try await eventStore.requestFullAccessToEvents()
// App 可以添加事件但不能读取现有事件
}
最佳实践
- 优先使用 Photos Picker 获取照片,只在确实需要全量访问时才请求相册权限。
- macOS 视频会议 App 使用 SCContentSharingPicker,不要自己实现屏幕选择器。
- 日历 App 评估是否真的需要读取权限——大部分只需添加事件的场景用 EventKitUI 或仅添加权限就够了。
- 请求权限升级(从仅添加到完整访问)时,在用户明确意图的时机请求,配上有意义的用途说明。
- 空间计算平台上的隐私要求更严格——不要尝试绕过系统 API 直接访问传感器数据。
- 定期审查你的 App 请求了哪些权限,能否用更细粒度的 API 替代。
还有什么值得关注
- “Embed the Photos picker in your app” Session 详细介绍嵌入式 Photos Picker 的能力。
- “What’s new in ScreenCaptureKit” Session 介绍 SCContentSharingPicker 的完整 API。
- macOS Sonoma 的屏幕共享菜单栏图标是系统级行为,所有录屏 App 都受影响。
- 空间计算平台的隐私模型是一个新的设计范式——App 通过系统 API 间接获取用户数据,不能直接访问传感器。
- Apple 的四大隐私支柱(数据最小化、设备端处理、透明度与控制、安全保护)是设计 App 隐私策略的好框架。
WWDC 2023