WWDC Quick Look 💓 By SwiftGGTeam
Meet privacy-preserving ad attribution

Meet privacy-preserving ad attribution

观看原视频

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):

  1. 浏览器获取源网站公钥(14:00)
  2. 浏览器把归因消息放入”信封”(隐藏内容)(14:15)
  3. 源网站对信封签名,返回给浏览器(14:23)
  4. 浏览器取出消息,上面带有源网站签名(14:36)
  5. 报告发送时附带签名,接收方可用公钥验证(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)。

基本流程

  1. 用户在 Social App 看到 Longboard App 的广告
  2. 点击广告,生成包含 AdNetwork ID、Publisher App ID、Campaign ID 的报告数据
  3. 跳转到 App Store,安装并启动 Longboard App
  4. Longboard App 调用 StoreKit API 触发归因报告
  5. 报告发送给广告网络

版本更新

版本最低系统新特性
2.1iOS 14.6+256 位公钥,更强的签名验证(18:09)
2.2iOS 14.6+支持 View-Through 归因(18:35)
2.2iOS 14.6+多 Postback 和 IP 保护(19:14)
2.2iOS 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)

核心启发

  1. PCM 不需要 ATT 授权。因为不涉及跨 App/网站追踪用户,使用 PCM 时不需要请求 App Tracking Transparency 权限。
  2. SKAdNetwork 的转化值要尽早设置。iOS 15 的 postback 有时间窗口,窗口关闭后更新转化值会丢失。建议在用户关键行为点(安装、注册、付费)立即调用 updateConversionValue
  3. 同时支持 PCM 和传统归因作为过渡。PCM 目前仅 Safari 支持,Chrome/Firefox 有自己的方案。建议同时实现,根据浏览器能力选择。
  4. 用 Debug Mode 加速测试。PCM 的 24-48 小时延迟让调试很痛苦,开启 Debug Mode 后报告 10 秒发出。
  5. SKAdNetwork 2.2 的 View-Through 扩展了归因场景。展示广告现在也能归因,虽然优先级低于点击,但覆盖了更多用户触点。

关联 Session

评论

GitHub Issues · utterances