Highlight
App Store 政策要求所有 App 在跨公司应用/网站追踪用户数据前,必须通过 AppTrackingTransparency 框架获取用户许可;追踪定义包含将本 App 收集的数据与其他公司数据关联用于广告或广告测量,以及向数据经纪人共享用户数据。
核心内容
你的 App 接入了第三方广告 SDK,但不确定是否需要请求追踪权限。搞错这个问题的后果很严重:App 可能被拒审,或者在用户拒绝后仍然违规追踪导致下架。
(01:14)App Tracking Transparency(ATT)对”追踪”的定义很具体。追踪指两种情况:
- 将本 App 收集的用户或设备数据,与其他公司的 App、网站或线下资产收集的数据关联,用于定向广告或广告测量
- 向数据经纪人(data broker)共享用户或设备数据
关键判断标准:数据是否跨越了公司边界。同一公司旗下的不同 App 之间共享数据,不构成追踪。
(01:44)几个具体例子:
- 不构成追踪:用户在 App A 中搜索了华夫饼,App A 用自己的数据向用户展示早餐广告。数据没有离开 App A 所属公司。
- 不构成追踪:App A 的公司还有另一个 App B,服务器把用户在两个 App 中的数据关联起来,用于 App A 中的广告投放。同一公司,不构成追踪。
- 构成追踪:App A 获取了用户的邮箱地址,另一家公司的外卖 App 也获取了同一个邮箱地址。外卖 App 把用户的夜间订餐习惯和邮箱地址共享给 App A,App A 把华夫饼兴趣和订餐习惯关联起来展示广告。数据跨越了公司边界,需要请求追踪权限。
(04:36)即使标识符经过哈希处理,只要用于跨公司关联数据,仍然属于追踪。哈希不能改变追踪的本质。
(05:03)第三方 SDK 的行为也算在你的 App 头上。如果一个广告 SDK 把用户数据共享给广告网络,广告网络再把数据与其他公司的数据关联,你的 App 需要请求追踪权限。即使 SDK 只返回聚合报告,只要底层发生了跨公司数据关联,就需要权限。
(07:06)向数据经纪人共享数据也需要权限。数据经纪人指定期收集、销售或向第三方披露终端用户个人信息的公司,且与这些用户没有直接关系。无论数据是否与其他公司数据关联,共享给数据经纪人都需要权限。
详细内容
实现追踪权限请求
(08:45)如果确定需要追踪,实现步骤如下:
1. 在 Info.plist 中添加用途描述
<key>NSUserTrackingUsageDescription</key>
<string>您的数据将用于提供个性化广告体验</string>
关键点:
- 用途描述字符串会显示在系统弹窗中
- 要清晰、简洁,让用户理解为什么请求权限
- 不需要包含 App 名称,系统会自动显示
- 如果不添加此键,调用请求方法时 App 会崩溃
2. 请求追踪授权
import AppTrackingTransparency
func requestTrackingPermission() {
ATTrackingManager.requestTrackingAuthorization { status in
switch status {
case .authorized:
// 用户允许追踪
print("Tracking authorized")
case .denied:
// 用户拒绝追踪
print("Tracking denied")
case .notDetermined:
// 尚未请求(极少见)
print("Tracking not determined")
case .restricted:
// 受限制(如家长控制)
print("Tracking restricted")
@unknown default:
break
}
}
}
关键点:
- 这是一个一次性弹窗,系统会记住用户选择
- 只有卸载重装后才会再次弹窗
- 必须在应用运行期间检查状态,不能假设状态不变
3. 检查追踪授权状态
func checkTrackingStatus() {
let status = ATTrackingManager.trackingAuthorizationStatus
if status == .authorized {
// 可以执行追踪相关操作
let idfa = ASIdentifierManager.shared().advertisingIdentifier
} else {
// 用户未授权,使用替代方案
}
}
关键点:
- 每次启动 App 都要检查状态
- 用户可以随时在设置中更改授权状态
- 只有在状态为
.authorized时才能继续追踪
用户拒绝后的替代方案
(11:31)如果用户拒绝追踪,有两条重要规则:
- 不能限制功能:App 的任何功能都不能以用户同意追踪为前提条件
- IDFA 返回全零:
advertisingIdentifier会返回00000000-0000-0000-0000-000000000000
替代方案包括:
- 第一方广告:使用 App 自己收集的数据展示广告
- 上下文广告:根据当前内容而非用户画像投放广告
- SKAdNetwork:苹果提供的隐私保护广告归因技术
- Private Click Measurement:私有点击测量,用于广告效果分析
隐私营养标签
(12:04)填写隐私营养标签和请求追踪授权是两个独立的步骤,都需要完成。隐私营养标签在 App Store Connect 中填写,向用户披露 App 收集的数据类型和用途。ATT 框架在代码中实现,运行时请求用户许可。
指纹识别永远禁止
(12:34)无论用户是否同意追踪,指纹识别(fingerprinting)永远被禁止。指纹识别指使用设备信号(浏览器配置、设备配置、位置、网络连接等)来识别设备或用户。即使收集这些数据有其他目的,如果实际用于生成指纹,也违反 Apple Developer Program License Agreement。
核心启发
在 App 中优雅地集成 ATT 权限请求
不要把 ATT 弹窗作为用户首次打开 App 的第一个交互。先让用户体验核心功能,在合适的时机(比如即将展示个性化内容前)再请求权限。在 Info.plist 中写清楚用途描述,告诉用户允许追踪能给他们带来什么价值。入口 API 是 ATTrackingManager.requestTrackingAuthorization。
为广告 SDK 做合规审查
列出 App 中所有第三方 SDK,逐一确认它们是否涉及跨公司数据关联。直接询问 SDK 提供商:“你的 SDK 是否会将本 App 的用户数据与其他公司的数据关联?“保留沟通记录。如果某个 SDK 涉及追踪但你的 App 不需要该功能,考虑移除它或寻找替代方案。
实现不依赖 IDFA 的广告策略
设计两套广告策略:一套在获得追踪授权时使用 IDFA 做精准投放;另一套在用户拒绝时使用上下文广告(根据当前页面内容匹配广告)或第一方数据。用 SKAdNetwork 做广告归因,既保护用户隐私又满足广告主需求。
关联 Session
- What’s new in SKAdNetwork — 隐私保护的广告归因技术
- Meet privacy-preserving ad attribution — 私有点击测量广告归因
- Create your Privacy Nutrition Label — 创建 App 隐私营养标签
评论
GitHub Issues · utterances