通过更好的隐私保护建立信任
Build trust through better privacy
2020年6月22日
一句话判断
iOS 14 的隐私升级是全方位的——精确位置变成可选、应用剪贴板读取有系统提示、本地网络访问需要授权、新的 Privacy Nutrition Label 要求公开数据收集行为,你的 app 必须重新审视每一个「悄悄使用用户数据」的地方。
这场 Session 讲了什么
这场 Session 是 iOS 14 隐私更新的全面概览,涵盖六大隐私增强:
Location(定位)。用户可以选择只给 app 大致位置而非精确位置。CLLocationManager 新增 accuracyAuthorization 属性区分精度级别。详见 Session 10660。
Clipboard(剪贴板)。当 app 读取剪贴板内容时,iOS 14 会显示系统通知(横幅)。这个改动直接暴露了大量 app 在后台静默读取剪贴板的行为,引发了广泛的公众关注。
Local Network(本地网络)。app 访问本地网络(Bonjour、LAN 设备发现)需要新的 NSLocalNetworkUsageDescription 权限声明和用户授权。智能家居、屏幕投屏类 app 受影响最大。
Wi-Fi Address(Wi-Fi 地址)。iOS 14 在加入 Wi-Fi 网络时使用随机 MAC 地址,app 无法再通过 MAC 地址追踪用户。
Camera/Microphone(摄像头/麦克风)。iOS 14 在状态栏新增了录制指示器(绿点=摄像头、橙点=麦克风),用户随时知道哪个 app 在使用传感器。
App Privacy Practices(隐私营养标签)。App Store Connect 要求每个 app 声明数据收集行为(收集了什么数据、用于什么目的、是否关联用户身份),这些信息会在 App Store 页面上公开展示。
值得深挖的点
剪贴板通知的实际影响
iOS 14 的剪贴板通知不是弹窗授权,而是「事后告知」。app 不需要请求权限就能读取剪贴板,但用户会看到一条横幅「XXX pasted from YYY」。这导致了 TikTok、LinkedIn 等知名 app 被发现频繁读取剪贴板,引发了隐私公关危机。如果你的 app 有读取剪贴板的需求,只在实际需要时读取(比如用户点击了「粘贴」按钮),不要在后台或每次启动时读取。
隐私营养标签的填写策略
隐私标签是分三层的:「Data Linked to You」(关联到你的数据)、「Data Not Linked to You」(不关联的数据)、「Data Used to Track You」(用于追踪的数据)。填写时要区分「收集」和「使用」——收集了邮箱用于注册是一回事,把邮箱传给广告平台用于跨 app 追踪是另一回事。后者必须在第三层声明。
代码片段
// iOS 14 本地网络权限请求
// Info.plist 中添加:
// <key>NSLocalNetworkUsageDescription</key>
// <string>需要访问本地网络来发现附近的智能设备</string>
// Bonjour 服务也需要声明
// <key>NSBonjourServices</key>
// <array>
// <string>_mydevice._tcp</string>
// </array>
import Network
class LocalNetworkChecker {
func checkLocalNetworkAccess() {
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
if path.usesInterfaceType(.wifi) {
// Wi-Fi 网络可用
// 但用户可能拒绝了本地网络权限
self.discoverLocalDevices()
}
}
monitor.start(queue: DispatchQueue.global())
}
func discoverLocalDevices() {
// 使用 NetServiceBrowser 发现 Bonjour 设备
// 如果用户拒绝本地网络权限,这里不会返回任何结果
}
}
// 安全地读取剪贴板(只在用户主动操作时)
class PasteboardManager {
// 错误做法:app 启动时自动读取
// func applicationDidBecomeActive() {
// let text = UIPasteboard.general.string // 会触发系统通知
// }
// 正确做法:只在用户点击「粘贴」按钮时读取
@IBAction func pasteButtonTapped(_ sender: UIButton) {
if UIPasteboard.general.hasStrings {
let text = UIPasteboard.general.string
// 用户明确知道这个操作,不会对剪贴板通知感到意外
handlePastedText(text)
}
}
// 使用 iOS 14 新增的 PasteButton(SwiftUI)
// 用户点击后自动读取剪贴板,不会显示系统通知
// 因为这是用户主动触发的操作
}
最佳实践
- 全面审计你的 app 的隐私行为。列出所有收集数据的地方(定位、剪贴板、IDFA、通讯录等),逐一确认每项收集是否有必要。能不收集的就不收集。
- 提前填写 App Store 的隐私标签。隐私标签是强制性的,不准确填写可能导致 app 被拒。和团队确认每个 SDK(特别是广告和分析 SDK)收集了什么数据。
- 本地网络权限要在首次使用时请求。不要在 app 启动时立刻弹出来。等到用户实际需要发现设备时再触发权限弹窗,配合清晰的说明文字。
还有什么值得关注
- iOS 14 的 IDFA 权限弹窗(App Tracking Transparency)在 2020 年 WWDC 后推迟到了 2021 年春季才强制执行,但迟早要做适配。
- 随机 MAC 地址意味着基于 MAC 地址的设备识别策略全部失效,需要改用其他方式(如用户登录)。
- Safari 14 的 ITP 进一步限制了第三方 Cookie 和跨站追踪,Web 端也要同步调整。