Highlight
PCM 和 SKAdNetwork 让广告归因不再需要追踪用户。所有归因计算在设备上完成,报告经过随机延迟和 IP 保护处理后发出。
核心内容
广告归因是数字营销的基石。广告主需要知道:投了钱的广告有没有带来转化?但传统的归因方式依赖跨站追踪——Cookie、IDFA——这些都在侵犯用户隐私。
Apple 的解决方案分两条线:
Private Click Measurement (PCM) 处理 Web 广告归因。用户点击广告、在目标网站完成购买,整个过程中广告主看不到用户身份。浏览器在设备上记录点击和转化,24-48 小时后随机发送一份聚合报告。报告里只有广告 campaign ID 和转化类型,没有用户标识。
SKAdNetwork 处理 App 安装归因。用户点击广告、跳转到 App Store、安装并打开 App,广告网络会收到一份聚合报告。报告包含广告网络 ID、发布者 App ID、Campaign ID 和转化值,同样没有用户标识。
这两个方案的核心思路一致:把归因计算从服务器移到设备,用信息熵限制和数据延迟来保护隐私。
详细内容
PCM:Web 广告隐私归因
PCM 是 W3C Privacy Community Group 的提案标准,Apple 在 Safari 中率先实现(05:57)。
Web-to-Web 归因流程
用户在搜索网站点击广告:
<!-- 广告链接添加两个属性 -->
<a href="https://longboardshop.biz/products/lemon-yellow"
attributionsourceid="55"
attributiondestination="https://longboardshop.biz">
Lemon Yellow Longboard
</a>
关键点:
attributionsourceid:8 位 entropy,标识广告 campaign(07:08)attributiondestination:转化目标网站(07:16)- 数据存储在浏览器本地,不上传(07:19)
用户在目标网站完成转化:
# 目标网站触发转化:向源网站发起 GET 请求
GET /pixel?trigger-data=15&priority=6
Host: searchforlongboard.biz
# 源网站 302 重定向到 well-known 路径
HTTP/1.1 302 Found
Location: /.well-known/private-click-measurement/trigger-attribution/
?trigger-data=15&priority=6
关键点:
trigger-data:4 位 entropy,标识转化类型(如加入购物车=15)(07:37)priority:6 位,高优先级可覆盖低优先级的转化(09:31)- 设计兼容传统 pixel,降低接入成本(09:38)
浏览器在 24-48 小时后随机发送报告:
{
"source_id": 55,
"trigger_data": 15,
"source_site": "searchforlongboard.biz",
"destination_site": "longboardshop.biz"
}
关键点:
- 报告发送到
/.well-known/private-click-measurement/report-attribution/(09:45) - 随机延迟防止通过时间关联用户身份(08:16)
- iOS 15 / macOS 12 起增加 IP 地址保护,防止指纹追踪(08:28)
- 报告不含任何用户标识信息(08:51)
App-to-Web 归因
App 中展示广告,点击后在 Safari 中完成转化:
// Info.plist 中添加报告端点
// NSAdvertisingAttributionReportEndpoint = https://myapp.example.com
// 创建归因视图覆盖在广告上
let attributionView = UIEventAttributionView()
attributionView.frame = adButton.frame
view.addSubview(attributionView)
// 用户点击广告时创建归因对象
let attribution = UIEventAttribution(
sourceIdentifier: 55,
destinationURL: URL(string: "https://longboardshop.biz")!,
sourceDescription: "Lemon Yellow Longboard Ad",
purchaser: "SocialAdNet"
)
// Scene-based 生命周期
let options = UIScene.OpenExternalURLOptions()
options.eventAttribution = attribution
UIApplication.shared.open(url, options: options) { _ in }
关键点:
UIEventAttributionView验证用户手势,防止虚假归因(12:02)UIEventAttribution包含 source ID、目标 URL、内容描述和购买者信息(12:21)- Info.plist 中的
NSAdvertisingAttributionReportEndpoint决定报告发送地址(11:27) - 转化侧和 web-to-web 完全相同(11:00)
防欺诈机制
PCM 使用 RSA 盲签名防止伪造归因(13:37):
- 浏览器获取源网站公钥(14:00)
- 浏览器把归因消息放入”信封”(隐藏内容)(14:15)
- 源网站对信封签名,返回给浏览器(14:23)
- 浏览器取出消息,上面带有源网站签名(14:36)
- 报告发送时附带签名,接收方可用公钥验证(14:46)
关键点:
- 源网站始终看不到原始消息,无法关联点击和转化(15:02)
- 盲签名确保报告可信但不泄露隐私(13:48)
调试模式
Safari Develop 菜单中开启 “Private Click Measurement Debug Mode”(15:23):
- Web Inspector 增强日志输出(15:38)
- 报告发送间隔从 24-48 小时缩短到 10 秒(15:40)
SKAdNetwork:App 安装归因
SKAdNetwork 涉及三方:广告网络、发布者 App、被广告 App(16:14)。
基本流程
- 用户在 Social App 看到 Longboard App 的广告
- 点击广告,生成包含 AdNetwork ID、Publisher App ID、Campaign ID 的报告数据
- 跳转到 App Store,安装并启动 Longboard App
- Longboard App 调用 StoreKit API 触发归因报告
- 报告发送给广告网络
版本更新
| 版本 | 最低系统 | 新特性 |
|---|---|---|
| 2.1 | iOS 14.6+ | 256 位公钥,更强的签名验证(18:09) |
| 2.2 | iOS 14.6+ | 支持 View-Through 归因(18:35) |
| 2.2 | iOS 14.6+ | 多 Postback 和 IP 保护(19:14) |
| 2.2 | iOS 14.6+ | Postback to Developer(19:48) |
View-Through 归因
展示广告也能归因:
let impression = SKAdImpression()
impression.adNetworkIdentifier = "socialadnet.example"
impression.campaignIdentifier = 55
impression.sourceAppStoreItemIdentifier = 1234567890
impression.advertisedAppStoreItemIdentifier = 9876543210
impression.signature = generatedSignature
impression.timestamp = Date()
impression.version = "2.2"
SKAdNetwork.startImpression(impression)
// 广告展示结束
SKAdNetwork.endImpression(impression)
关键点:
startImpression/endImpression标记展示开始和结束(18:42)- View-Through 的 Fidelity type 为 0,低于点击归因的 1(18:55)
- 高 Fidelity 的归因优先上报(19:07)
多 Postback 和 IP 保护
iOS 14.6 起支持:
- 获胜广告网络和最多 5 个候选网络都能收到报告(19:22)
- 获胜网络可能收到 crowd anonymity 控制值(sourceApp、conversion value)(19:36)
- 候选网络收不到这些敏感值(19:41)
- 增加 IP 地址保护(19:17)
Postback to Developer
获胜归因报告同时发送给被广告 App 的开发者:
<!-- Info.plist -->
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://myapp.example.com</string>
关键点:
- 使用
NSAdvertisingAttributionReportEndpoint配置端点(20:04) - 报告发送到
/.well-known/路径(20:16) - 和 PCM app-to-web 共用同一个配置键(20:07)
测试最佳实践
- 每个 impression 的 nonce 必须唯一,用于防欺诈(20:29)
- 创建签名时参数顺序很重要,参考文档确认(20:39)
- 测试 postback 使用 development-signed source app,source app ID 设为 0(20:53)
- 下载测试 profile 可加速 postback 传输(21:01)
核心启发
- PCM 不需要 ATT 授权。因为不涉及跨 App/网站追踪用户,使用 PCM 时不需要请求 App Tracking Transparency 权限。
- SKAdNetwork 的转化值要尽早设置。iOS 15 的 postback 有时间窗口,窗口关闭后更新转化值会丢失。建议在用户关键行为点(安装、注册、付费)立即调用
updateConversionValue。 - 同时支持 PCM 和传统归因作为过渡。PCM 目前仅 Safari 支持,Chrome/Firefox 有自己的方案。建议同时实现,根据浏览器能力选择。
- 用 Debug Mode 加速测试。PCM 的 24-48 小时延迟让调试很痛苦,开启 Debug Mode 后报告 10 秒发出。
- SKAdNetwork 2.2 的 View-Through 扩展了归因场景。展示广告现在也能归因,虽然优先级低于点击,但覆盖了更多用户触点。
关联 Session
- Develop advanced web content — Safari 和 WebKit 的新特性
- Explore WKWebView additions — WKWebView 最新更新
- Apple’s privacy pillars in focus — Apple 隐私技术全景
评论
GitHub Issues · utterances