WWDC Quick Look 💓 By SwiftGGTeam
Meet AdAttributionKit

Meet AdAttributionKit

元の動画を見る

ハイライト

Apple は iOS および iPadOS 向けに、SKAdNetwork を基盤として構築された新しい広告アトリビューションフレームワーク「AdAttributionKit」を発表しました。SKAdNetwork と同様に、クラウドアノニマティ(群衆匿名性)に基づいています:コンバージョン数が少ないときは少量のデータを返し、群衆の規模が大きくなるとより多くのデータが返されます。


主要内容

広告アトリビューションを行う開発者にとって、SKAdNetwork は馴染み深い存在です。Apple は 2018 年からデバイスレベルの識別子を使わずにプライバシー保護型のアトリビューションを行うために SKAdNetwork を使用してきましたが、その機能は常に限定的でした:ビュースルーアトリビューションがなく、再エンゲージメントの追跡もなく、クラウドアノニマティによって制限されたポストバックデータは粒度が粗いものでした。

AdAttributionKit は Apple の回答です。SKAdNetwork のコアとなるクラウドアノニマティの設計(コンバージョンが少ないときは少ないデータ、多いときは多いデータを返す)を維持しながら、3 つの重要な欠落を補います。最初の広告インプレッションタイプはカスタムクリックで、広告ネットワークは独自の UI を使って広告を表示し、ユーザーがクリックするとインストールページにリダイレクトされます。2 つ目はビュースルーで、広告が 2 秒以上表示されれば有効なインプレッションとみなされます。これは SKAdNetwork が全くサポートしていなかった機能です。3 つ目は SKOverlay と SKStoreProductViewController で、SKAdNetwork のパターンを踏襲しつつ、新しい appImpression パラメータを追加しています。さらに重要な変更は再エンゲージメントアトリビューションです。ターゲットアプリがユーザーのデバイスにすでにインストールされている場合、広告をクリックしてもインストールはトリガーされず、代わりにユニバーサルリンクを持ってアプリが直接開かれます。これにより、広告主は「離脱したユーザーを引き戻す」効果を測定できます。ポストバックもコンパクト JWS 形式に変更され、conversion-type(download / redownload / re-engagement)、source-identifier(2〜4 桁、クラウドアノニマティによって制御)などのフィールドを含みます。AdAttributionKit は SKAdNetwork と完全に相互運用可能で、すでに登録済みの SKAdNetwork 広告ネットワークは追加の申請なしで使用できます。


詳細

広告インプレッションデータの JWS 形式

AdAttributionKit の広告インプレッション(ad impression)はコンパクト JWS 形式を使用します。主要なフィールドは以下の通りです:

  • advertised-item-identifier:プロモートされるアプリの App ID
  • publisher-item-identifier:広告を表示するアプリの App ID
  • source-identifier:4 桁の整数で、広告キャンペーン情報を表します。動作は SKAdNetwork 4.0 と同じです

JWS から AppImpression インスタンスを作成するコードは以下の通りです(03:27):

// 広告ネットワークからコンパクト JWS 文字列を取得
let jwsString = fetchAdImpressionJWS()
// JWS を使って AppImpression を初期化
let appImpression = AppImpression(jwsRepresentation: jwsString)

キーポイント:

  • fetchAdImpressionJWS() は開発者が独自に実装します。広告ネットワークとの統合方法によって異なります
  • AppImpression インスタンスは作成後 15 分間有効です。15 分を超えると再作成が必要です
  • この appImpression インスタンスは、後続の広告表示とクリック処理に使用されます

カスタムクリック広告の実装

カスタムクリックは、AdAttributionKit がサポートする最初の広告インプレッションタイプです(05:03):

// カスタム広告ビューを作成
let customAdView = UIView()
// UIEventAttributionView を作成して子ビューとして追加
let attributionView = UIEventAttributionView()
customAdView.addSubview(attributionView)
// attributionView はユーザーインタラクションを受け取るために最前面に配置する必要がある

// タップを処理
func handleAdTap() {
    appImpression.handleTap()
}

キーポイント:

  • UIEventAttributionView は、ユーザーインタラクションを受け取るすべてのビューの上に配置する必要があります
  • handleTap()AppImpression の初期化後 15 分以内に呼び出す必要があります
  • handleTap() を呼び出すと、AdAttributionKit は自動的にユーザーを広告アプリをインストールできるストアページにナビゲートします

ビュースルー広告の実装

ビュースルーは SKAdNetwork に欠けていた機能で、AdAttributionKit が補います(06:07):

// ビデオの再生開始
appImpression.beginView()
// ビデオの再生終了
appImpression.endView()

キーポイント:

  • beginView()endView() は同じ AppImpression インスタンスで呼び出す必要があります
  • 2 回の呼び出しの間隔は少なくとも 2 秒必要です。これは業界標準です
  • 同じ広告ネットワークは、同じプロモートされるアプリに対して複数のビュースルーインプレッションを同時に開くことはできません
  • すべての beginView()endView() とペアになっている必要があります

コンバージョンバリューの更新

コンバージョンバリューは、広告効果と ROAS(広告費用対効果)を測定するために使用されます(11:46):

// シナリオ 1:ユーザーがアカウントを登録 — 低価値イベント
let update1 = PostbackUpdate(
    fineConversionValue: 10,
    lockPostback: false,
    coarseConversionValue: .low
)
Postback.updateConversionValue(update1)

// シナリオ 2:ユーザーがビデオを視聴 — 中価値イベント
let update2 = PostbackUpdate(
    fineConversionValue: 38,
    lockPostback: false,
    coarseConversionValue: .medium
)
Postback.updateConversionValue(update2)

// シナリオ 3:ユーザーがビデオをアップロード — 高価値イベント、ポストバックをロック
let update3 = PostbackUpdate(
    fineConversionValue: 42,
    lockPostback: true,
    coarseConversionValue: .high
)
Postback.updateConversionValue(update3)

キーポイント:

  • fineConversionValue は 0〜63 の整数で、具体的な意味は広告主、広告ネットワーク、MMP が共同で決定します
  • lockPostbacktrue に設定すると、このコンバージョンウィンドウ内で更新が行われなくなり、AdAttributionKit はポストバックを凍結してスケジュールします
  • ロックしてもポストバックは即時送信されません。プライバシー保護のため遅延があります
  • coarseConversionValue(low / medium / high)は、クラウドアノニマティによって fine value の送信が許可されない場合のフォールバックです

再エンゲージメントアトリビューション

再エンゲージメントは、AdAttributionKit の最も核心的な新機能で、「離脱したユーザーをアプリに引き戻す」広告の効果を追跡するために使用されます(16:32):

広告インプレッションの JWS に、追加の "eligible-for-re-engagement" フィールドが必要です。コード実装は以下の通りです:

// 再エンゲージメントが有効になった JWS を使って AppImpression を作成
let appImpression = AppImpression(jwsRepresentation: jwsString)

// タップ処理で再エンゲージメント URL を渡す
func handleAdTap() {
    let reengagementURL = URL(string: "https://example.com/offer")!
    appImpression.handleTap(reengagementURL: reengagementURL)
}

キーポイント:

  • handleTap(reengagementURL:) は、すでにインストールされているターゲットアプリを開き、その URL を渡します
  • AdAttributionKit は自動的に再エンゲージメント URL にクエリパラメータを追加します。アプリはこのパラメータをチェックして、開かれたのが再エンゲージメントによってトリガーされたかどうかを判断できます
  • 再エンゲージメントのポストバックでは conversion-type"re-engagement" で、広告インタラクションタイプは "click" のみです(ビュースルーによる再エンゲージメントはサポートされていません)
  • 初回のコンバージョンバリュー更新は、コンバージョン後 48 時間以内に行う必要があります

再エンゲージメントのコンバージョンバリューは、インストールのものと別々に更新できます(20:25):

// 再エンゲージメントポストバックのみを更新
let update = PostbackUpdate(
    fineConversionValue: 20,
    lockPostback: false,
    coarseConversionValue: .medium
)
Postback.updateConversionValue(update, conversionTypes: .reengagement)

// インストールポストバックのみを更新
Postback.updateConversionValue(update, conversionTypes: .install)

// すべてのポストバックを更新
Postback.updateConversionValue(update, conversionTypes: [.install, .reengagement])

キーポイント:

  • conversionTypes パラメータは、どのタイプのポストバックを更新するかを制御します:.reengagement.install、または両方
  • nil を渡すと、すべてのタイプを更新することと同じです
  • これにより、再エンゲージメントとインストールのコンバージョンロジックを独立して管理できます

開発者モードでのテスト

アトリビューションフローは非同期で時間のランダム化があるため、テストは困難です。AdAttributionKit は開発者モードを提供しています(21:27):iOS の「設定 > 開発者」で AdAttributionKit Developer Mode のスイッチをオンにすると、システムは時間のランダム化を削除し、コンバージョンウィンドウを短縮し、ポストバックの送信を加速して、ローカルテストを容易にします。


重要ポイント

  1. すでにインストールされているアプリの再エンゲージメント広告をアトリビューションする:アプリにユーザー離脱の問題がある場合、再エンゲージメントアトリビューションを使って「離脱したユーザーを広告で引き戻す」効果を追跡できます。広告インプレッションの JWS に "eligible-for-re-engagement" フィールドを追加し、タップ処理時にユニバーサルリンクを渡し、アプリ側で AdAttributionKit が追加したクエリパラメータをチェックして、再エンゲージメント広告によってトリガーされたかどうかを判断します。なぜ価値があるか:SKAdNetwork にはこの機能が全くなく、再エンゲージメントは多くのアプリの成長において重要な要素です。どう始めるか:アプリでユニバーサルリンクをサポートし、広告ネットワーク側で JWS に再エンゲージメントフィールドを追加します。

  2. ビュースルーアトリビューションを使ってエクスポージャーアトリビューションのチェーンを補完する:以前、SKAdNetwork はクリックアトリビューションのみをサポートしており、ビデオなどの純粋なインプレッション型広告の効果を測定できませんでした。AdAttributionKit のビュースルーは、2 秒以上表示されれば有効なエクスポージャーとみなされ、ポストバックの ad-interaction-type"view" になります。なぜ価値があるか:多くの広告キャンペーンはクリックではなくインプレッションが中心であり、ビュースルーアトリビューションがないと、大量の広告費が正しく評価できません。どう始めるか:ビデオやバナー広告の表示/非表示コールバックでそれぞれ beginView()endView() を呼び出します。

  3. 開発者モードを使ってローカルで完全なアトリビューションフローを走らせる:AdAttributionKit のアトリビューションフローは、本番環境でランダムな遅延と待機ウィンドウがあり、直接リリースして検証するのは難しいです。開発者モードはすべての時間ウィンドウを短縮し、「インプレッション → クリック → インストール → コンバージョンバリューの更新 → ポストバックの受信」という完全なチェーンを数分で実行できるようにします。なぜ価値があるか:広告アトリビューションのバグはリリース後に発見されることが多く、修正コストは非常に高いです。どう始めるか:テストデバイスの「設定 > 開発者」で AdAttributionKit Developer Mode を有効にし、Xcode でテストを実行します。


関連セッション

  • What’s new in StoreKit and In-App Purchase — StoreKit とアプリ内課金の最新アップデート。AdAttributionKit と同じ App Store エコシステムに属します
  • Explore App Store server APIs for In-App Purchase — サーバー側で App Store 通知を受信する方法。アトリビューションポストバックのサーバー側解析と補完します
  • Implement App Store Offers — App Store オファーコードとプロモーションオファーの実装。再エンゲージメントシナリオと連携します
  • What’s new in privacy — Apple プライバシーフレームワークの全体アップデート。AdAttributionKit のクラウドアノニマティはその一環です

コメント

GitHub Issues · utterances