用途
axiom-privacy-ux 是一份隐私优先的应用设计指南,面向 Apple 平台开发者。它帮助开发者在应用中实现隐私清单、系统权限请求、App Tracking Transparency(ATT)、跟踪域名管理、Required Reason API 声明,以及 App Store Connect 的隐私营养标签(Privacy Nutrition Labels)。资料指出,Apple Design Award 社会影响类获奖作品都以合乎伦理的方式处理数据,隐私优先设计是重要的差异化因素。
主要能力
1. 隐私清单(Privacy Manifests)
隐私清单文件名为 PrivacyInfo.xcprivacy,是 Apple 用于透明说明数据收集与跟踪的框架。创建方式:在 Xcode 导航栏选择 File → New → File,选择 "App Privacy File",命名为 PrivacyInfo.xcprivacy,并加入应用 target 或 SDK framework。
文件为 Property List 结构,包含三个关键键:
- NSPrivacyTracking:声明应用是否跟踪用户。跟踪的定义是:将来自本应用的用户/设备数据与其他应用或网站的数据结合,用于定向广告或数据经纪目的。若为 true,还必须声明 NSPrivacyTrackingDomains 跟踪域名数组。iOS 17 行为:若用户未授予 ATT 权限,发往这些跟踪域名的网络请求会被自动阻止。
- NSPrivacyCollectedDataTypes:声明应用收集的所有数据类型,每项包含数据类型、是否与用户身份关联(Linked)、是否用于跟踪(Tracking)以及用途(Purposes)。常见数据类型包括姓名、邮箱、电话、物理地址、精确位置、粗略位置、照片或视频、联系人、用户 ID 等;常见用途包括应用功能、分析、产品个性化、开发者广告、第三方广告。
- NSPrivacyAccessedAPITypes:声明所使用的 Required Reason API 及其批准理由代码。
2. 权限请求体验(Permission Request UX)
资料强调应使用即时请求(Just-in-Time)而非启动时一次性请求全部权限。反例是在 didFinishLaunchingWithOptions 中同时请求相机、位置、通知、相册权限;正例是在用户触发具体功能(如点击拍照按钮)时再请求,并先展示预授权教育弹窗(Pre-Permission Education Screen),说明为什么需要该权限。资料称这样做可让系统弹窗拒绝率下降 60-80%,并减少 App Store 中"为什么需要这个权限"的差评。
权限被拒时不应让用户走入死胡同,应提供打开设置的提示。可通过 UIApplication.openSettingsURLString 打开应用设置,iOS 15.4+ 可用 UIApplication.openNotificationSettingsURLString 打开通知设置。
3. App Tracking Transparency(ATT)
需要请求 ATT 权限的情形:跨其他公司拥有的应用/网站跟踪用户、与数据经纪共享用户数据、使用会跟踪的第三方 SDK(如 Facebook SDK、Google Analytics 等)。不需要 ATT 的情形:仅使用第一方分析(不与其他公司共享)、仅基于本应用数据做广告个性化、使用欺诈检测/安全措施。
实现上使用 ATTrackingManager.requestTrackingAuthorization,需 iOS 14.5+。资料提醒应等应用处于活跃状态后再展示弹窗(例如延迟 1 秒),过早展示会导致自动拒绝。需处理 authorized、denied、notDetermined、restricted 及 unknown 各状态,未授权时不得跟踪。
自定义 ATT 提示文案通过 Info.plist 的 NSUserTrackingUsageDescription 配置。资料给出正反例:反例如"我们重视您的隐私"(含糊)、"应用运行需要此权限"(不诚实)、"为了变现"(用户不关心);正例如"这有助于向您展示可能喜欢的相关广告"、"个性化广告有助于保持本应用免费"。还建议在系统 ATT 弹窗之前先展示自己的预跟踪提示,资料称教育可将选择加入率提高 20-40%。同时应做好优雅降级:未授权时提供有限、保护隐私的分析能力。
4. 跟踪域名管理
在 PrivacyInfo.xcprivacy 中声明 NSPrivacyTracking 为 true 并列出 NSPrivacyTrackingDomains。iOS 17 下若用户拒绝 ATT,发往这些域名的请求会被自动阻止。
资料建议采用域名分离策略:将跟踪与非跟踪功能拆分到不同主机。例如原先 api.example.com 混合了跟踪与应用功能,可拆为 api.example.com(仅应用功能)与 tracking.example.com(仅跟踪),并在清单中声明 tracking.example.com。这样即使跟踪被阻止,应用功能仍可正常工作。
Xcode 15+ 提供 Points of Interest 工具检测意外的跟踪连接:Product → Profile,选择 "Points of Interest" instrument,运行应用,查看 "Privacy" 轨道中的网络连接并审查被标记的域名,然后决定将其声明到 NSPrivacyTrackingDomains 或停止连接。
5. Required Reason API
Required Reason API 指可能被滥用于指纹识别(在未获授权情况下识别设备)的 API。资料明确指出:即使获得 ATT 权限,指纹识别也绝不被允许。这类 API 有批准的使用场景,必须声明适用的批准理由。
常见类别与理由代码示例:
- 文件时间戳(creationDate、modificationDate):C617.1 - DDA9.1
- 系统启动时间(systemUptime、processInfo.systemUptime):35F9.1、8FFB.1
- 磁盘空间(NSFileSystemFreeSize、volumeAvailableCapacity):E174.1、7D9E.1、B728.1
- 活跃键盘(activeInputModes):54BD.1、3EC4.1
- UserDefaults:CA92.1、1C8F.1、C56D.1、AC6B.1
以磁盘空间为例,E174.1 表示写入文件前检查空间是否充足,7D9E.1 表示向用户展示存储信息,B728.1 表示在用户选择加入的可选分析中包含磁盘空间。声明时在 NSPrivacyAccessedAPITypes 中指定 NSPrivacyAccessedAPICategoryDiskSpace 与理由代码。UserDefaults 的 CA92.1 表示访问应用自身存储的设置/偏好,1C8F.1 表示访问 App Group 存储的信息,C56D.1 表示访问 App Clip 存储的信息,AC6B.1 表示第三方 SDK 访问自身默认值。若使用场景未被覆盖,可通过 Apple 反馈表单提交。
6. 隐私营养标签(Privacy Nutrition Labels)
用于 App Store Connect 的隐私标签需覆盖数据类型与类别,包括:标识符(用户 ID、设备 ID)、联系信息(姓名、邮箱、电话、物理地址)、位置(精确、粗略)、用户内容(照片或视频、音频、游戏内容、客服消息)、浏览历史、搜索历史、财务信息、健康与健身、联系人、敏感信息(种族/民族、政治观点、宗教信仰)等。
数据用途分为:应用功能、分析、产品个性化、开发者广告、第三方广告。还需区分数据是否与用户身份关联(Linked vs Not Linked),以及是否用于跟踪。
使用方式
该技能以文档形式提供,开发者按需查阅对应章节:创建隐私清单时参考 Part 1;设计权限请求流程参考 Part 2;实现 ATT 参考 Part 3;管理跟踪域名参考 Part 4;声明 Required Reason API 参考 Part 5;准备隐私标签参考 Part 6。文中包含可直接参考的 Swift 代码片段与 plist 配置示例。
适用场景
- 创建隐私清单(PrivacyInfo.xcprivacy)
- 请求系统权限(相机、位置等)
- 实现 App Tracking Transparency
- 为 App Store Connect 准备隐私营养标签
- 管理跟踪域名以避免意外跟踪
- 使用 Required Reason API(NSFileSystemFreeSize、UserDefaults 等)
- 向用户透明解释数据用途
- 排查因隐私问题导致的 App Store 审核被拒
系统要求
- iOS 14.5+:App Tracking Transparency
- iOS 17+:自动阻止跟踪域名
- Xcode 15+:隐私报告与清单编辑
- 2024 年春季起:App Review 强制执行
限制
资料未提供该技能的具体安装命令、收费方式、价格或平台支持范围等信息。