Meet AdAttributionKit
System Frameworks 进阶 20m

认识 AdAttributionKit

Meet AdAttributionKit

2024年6月10日

在 Apple 官方观看视频

一句话判断

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 中模拟完整的广告归因流程,不需要真实的广告投放。
WWDC 2024