认识 AdAttributionKit
Meet AdAttributionKit
2024年6月10日
一句话判断
AdAttributionKit 是 SKAdNetwork 的继任者,新增了 re-engagement 归因和 view-through 广告支持,如果你在做广告归因相关的工作,这是必须了解的框架。
这场 Session 讲了什么
Apple 在 iOS 和 iPadOS 上推出了全新的广告归因框架 AdAttributionKit,它是基于 SKAdNetwork 的基础构建的。和 SKAdNetwork 一样,它基于 crowd anonymity(人群匿名性)机制:当转化数量少时返回少量数据,随着人群规模增大,返回更多数据。
AdAttributionKit 的核心变化包括:新的 compact JWS 格式的广告展示数据(ad impression)、三种广告展示方式(custom click、view-through、SKOverlay/SKStoreProductViewController)、改进的 postback 机制(包含更丰富的 conversion 信息),以及全新的 re-engagement 归因(可以追踪用户重新打开已安装 App 的广告效果)。Session 还介绍了如何使用 Xcode 的 AdAttributionKit testing framework 来本地测试归因流程。
值得深挖的点
Re-engagement 归因
这是 AdAttributionKit 相比 SKAdNetwork 最重要的新增功能。传统广告归因只追踪”看到广告 -> 安装 App”这个转化路径。但现实中,大量广告投放的目的是让已安装 App 的用户重新活跃起来——比如电商大促、游戏新版本更新。
AdAttributionKit 的 re-engagement 归因让开发者能追踪”看到广告 -> 重新打开已安装 App”这条路径。在 postback 中,conversion-type 字段会有 re-engagement 这个值。这意味着广告网络可以评估 re-engagement 广告的真实效果,而不只是安装广告。对于重视用户留存的广告主来说,这是比安装归因更有价值的数据。
View-through 广告归因
SKAdNetwork 主要处理 click-based 归因(用户点击广告后安装 App)。AdAttributionKit 新增了 view-through 广告的支持——用户看到广告但没有点击,之后去 App Store 安装了被推广的 App。通过 beginView() 和 endView() API,publisher app 可以记录广告展示的时间窗口。在 postback 中,ad-interaction-type 会是 "view" 而不是 "click"。
这填补了 SKAdNetwork 的一个重要空白。广告行业很清楚,很多用户看到广告后不会直接点击,而是过一段时间自己去搜索安装。View-through 归因让这部分转化也能被衡量。
代码片段
创建 AppImpression 并处理点击
场景:publisher app 展示自定义广告并处理用户点击。
// 1. 从广告网络获取 JWS 字符串
let jwsString = fetchAdImpressionJWS()
// 2. 创建 AppImpression
let appImpression = AppImpression(jwsRepresentation: jwsString)!
// 3. 设置广告视图,添加 UIEventAttributionView
let attributionView = UIEventAttributionView(frame: adView.bounds)
adView.addSubview(attributionView) // 必须在最上层
// 4. 处理点击
adView.addTarget(self, action: #selector(adTapped))
@objc func adTapped() {
// handleTap 必须在 AppImpression 创建后 15 分钟内调用
appImpression.handleTap()
}
坑:UIEventAttributionView 必须放在所有接收用户交互的 view 之上,否则点击归因会失败。handleTap() 有 15 分钟的有效期。
View-through 广告的生命周期
场景:视频广告的 view-through 归因。
// 视频开始播放
func videoDidStart() {
appImpression.beginView()
}
// 视频结束播放
func videoDidEnd() {
appImpression.endView()
}
// 注意:beginView 和 endView 之间至少 2 秒
// 必须在同一个 AppImpression 实例上调用
// 同一广告网络不能同时有多个相同广告的 view-through 展示
坑:每次 beginView 必须对应一次 endView,同一广告网络不能对同一广告同时开启多个 view-through 展示。
更新 conversion value
场景:被推广的 App 在用户使用过程中更新转化价值。
import AdAttributionKit
// 用户完成了有价值的操作(如注册、购买)
AdAttributionKit.updateConversionValue(3) { error in
if let error = error {
// 处理错误,可能是 crowd anonymity 级别不够
}
}
坑:conversion value 是否出现在 postback 中取决于 crowd anonymity 级别——低匿名性时可能不包含。
最佳实践
已有项目:如果你在使用 SKAdNetwork,AdAttributionKit 的迁移路径是平滑的。SKOverlay 和 SKStoreProductViewController 的接入方式几乎不变,只是多了 appImpression 参数。Custom click 广告的接入方式也类似。建议先添加 view-through 支持,因为这是 SKAdNetwork 缺失的功能。
新项目:直接使用 AdAttributionKit 而不是 SKAdNetwork。新的 JWS 格式、re-engagement 归因、view-through 支持都是 SKAdNetwork 没有的。利用 Xcode 的 AdAttributionKit testing framework 在本地测试完整归因流程,不要等到线上才发现问题。
还有什么值得关注
- Postback 现在以 JWS 签名 + 无签名字段的组合形式发送,安全性比 SKAdNetwork 的纯签名方式更灵活。
- Source identifier 仍然是 4 位整数,但 crowd anonymity 会控制 postback 中实际包含几位(最少 2 位)。
- 测试框架让你可以在 Xcode 中模拟完整的广告归因流程,不需要真实的广告投放。