SKAdNetwork 4.0 指南:三個回傳視窗的運作原理

opoinstall
2026-08-19
5 min read

SKAdNetwork 4.0 的多視窗歸因如何運作? SKAdNetwork 4.0 將轉換衡量分為三個連續的視窗,分別涵蓋應用程式首次開啟後的第 0–2 天、第 3–7 天以及第 8–35 天。Apple 會為每次應用程式下載指派一個回傳資料層級,該層級決定了符合條件的回傳是揭露精細、粗略還是簡化的歸因資料。

SKAdNetwork 4.0 是 Apple 用於 iOS 的隱私保護行動行銷歸因框架,可在確保隱私安全的前提下進行端對端活動衡量。它導入了涵蓋首次開啟後長達 35 天的三個連續轉換視窗、階層式來源識別碼、粗略轉換數值以及視窗鎖定機制,以便在不蒐集持續性裝置身分識別的情況下,評估中段漏斗的使用者生命週期價值。

名詞 定義
SKAdNetwork Apple 用於隱私保護廣告活動歸因的平台級框架。
轉換視窗 自首次開啟應用程式起算的三個指定衡量期間之一,在此期間內,獲客應用程式可以更新轉換數值。
回傳資料層級 由平台指派的層級(從第 0 層到第 3 層),用於規範回傳中傳回的後設資料細緻度。
粗略轉換數值 一個三層式的轉換訊號(lowmediumhigh),當精細轉換資料無法取得或在後續轉換視窗中可能會被揭露。

一目了然:關鍵回傳時間軸與揭露規則

  • 視窗 1(首次開啟後第 0–2 天):可能會揭露精細(0–63)或粗略(lowmediumhigh)數值;在額外隨機延遲 24–48 小時後發送。
  • 視窗 2(首次開啟後第 3–7 天):當回傳資料層級提供並允許時,可能會揭露 coarse-conversion-value;否則該欄位將會省略。在額外隨機延遲 24–144 小時後發送。
  • 視窗 3(首次開啟後第 8–35 天):當回傳資料層級提供並允許時,可能會揭露 coarse-conversion-value;否則該欄位將會省略。在額外隨機延遲 24–144 小時後發送。
  • 第 0 層資料限制:落入第 0 層的下載會收到單一回傳,其中包含 2 位數的來源 ID 且沒有轉換數值;第二與第三次回傳會被省略。
  • 多次回傳要求:若要符合接收多次勝出回傳的資格,廣告必須使用 SKAdNetwork 4 或更新版本進行簽署,且獲客應用程式必須在適用的轉換視窗期間更新轉換數值。

什麼是 SKAdNetwork 4.0 及其多視窗歸因的運作方式

從單一計時器限制到多視窗生命週期追蹤的結構性演進

Apple StoreKit Ad Network(SKAdNetwork 2.0 與 3.0)的早期版本是在單一 24 小時滾動計時器下運作。在 SKAdNetwork 3 及更早版本中,有效的遞增轉換數值更新可以透過重新啟動 24 小時計時器來延長滾動轉換期間。一旦經過 24 小時而沒有更新,視窗即會關閉,且 Apple 會在隨機延遲後發送單一回傳。

這種單一計時器架構造成了營運上的摩擦:

  • 受限的觀察視野:行銷人員只能衡量安裝後最初幾天內發生的早期互動。
  • 報表延遲: 重複且符合資格的轉換更新可能會延長實際的衡量期間並延遲最終回傳,進而拖慢自動化廣告競標演算法。
  • 有限的長尾能見度:SKAdNetwork 3 沒有專門用於結構化第 7 天至第 30 天衡量的後續轉換視窗。

SKAdNetwork 4.0 透過建立三個固定且連續的衡量視窗(以使用者首次開啟應用程式的時間為基準)來重構此模型。

將歸因計時器與活躍使用者工作階段解耦

在 SKAdNetwork 4.0 中,轉換視窗是根據固定的日曆時間長度而非持續的使用者活動來推進。當使用者在歸因廣告曝光後首次開啟應用程式時,作業系統即會啟動視窗 1。

無論使用者在前 48 小時內開啟應用程式一次還是五十次,視窗 1 都會在滿 48 小時時計票關閉(除非透過視窗鎖定明確提早完成)。接著系統會自動推進至視窗 2(第 3 天到第 7 天),隨後是視窗 3(第 8 天到第 35 天)。這種解耦保證了下游資料管線具有結構化的回傳發送間隔。

雙層密碼學簽章鏈

SKAdNetwork 在兩個不同的階段使用公開金鑰密碼學來維持資料完整性:

  • 廣告曝光階段(廣告聯播網至 Apple):當廣告聯播網提供曝光時,它會使用其私密金鑰對廣告酬載進行簽署。在應用程式安裝並啟動後,作業系統會根據向 Apple 註冊的廣告聯播網公開金鑰來驗證此簽章,以確認歸因資格。
  • 安裝驗證階段(Apple 至廣告聯播網/開發者):當轉換視窗關閉時,Apple 會對安裝驗證回傳酬載進行簽署。接收端的廣告聯播網與開發者端點會使用 Apple 的公開金鑰來驗證此簽章,以確認回傳的真實性與完整性。

另請參閱:SKAdNetwork ──> 行動歸因模型

三個回傳視窗的機制與衡量時間軸

視窗 1:捕捉早期互動與高精確度轉換訊號

  • 衡量區間:第 0 天到第 2 天(首次開啟後的最初 48 小時)。
  • 可用的資料揭露:精細轉換數值(0 到 63 的 6 位元整數)或粗略數值(lowmediumhigh),由指派的回傳資料層級決定。
  • 隨機回傳延遲:視窗關閉或鎖定後 24 到 48 小時。
  • 分析目標:衡量即時新手引導完成度、教學里程碑、初始購買轉換以及早期流失風險。

視窗 2:評估早期使用者留存與中段漏斗里程碑

  • 衡量區間:首次開啟後的第 3 天到第 7 天(第 48 小時至第 168 小時)。
  • 可用的資料揭露:當回傳資料層級提供並允許時,可能會揭露 coarse-conversion-valuelowmediumhigh);否則該欄位將會省略。視窗 2 不支援精細數值(0 到 63)。
  • 隨機回傳延遲:視窗關閉或鎖定後 24 到 144 小時(1 到 6 天)。
  • 分析目標:評估第 3 天至第 7 天留存率、多日互動循環、初始訂閱試用以及重複購買行為。

視窗 3:衡量長尾留存與累積生命週期價值

  • 衡量區間:首次開啟後的第 8 天到第 35 天(第 168 小時至第 840 小時)。
  • 可用的資料揭露:當回傳資料層級提供並允許時,可能會揭露 coarse-conversion-valuelowmediumhigh);否則該欄位將會省略。
  • 隨機回傳延遲:視窗關閉或鎖定後 24 到 144 小時(1 到 6 天)。
  • 分析目標:捕捉第 1 個月留存基準、試用轉付費訂閱轉換以及長尾變現里程碑。

技術時間軸圖表,在溫暖柔和的乳白色網格背景上說明 SKAdNetwork 4.0 三個連續轉換視窗、回傳延遲範圍以及精細與粗略數值規則。

Ad Impression
      │
      ▼
App Install
      │
      ▼
First App Launch  ← conversion measurement t = 0
      │
      ├── Window 1: Day 0–2 after first launch
      │      Fine or coarse disclosure
      │      24–48h randomized delay after close/lock
      │
      ├── Window 2: Day 3–7 after first launch
      │      Coarse disclosure only (or absent)
      │      24–144h randomized delay after close/lock
      │
      └── Window 3: Day 8–35 after first launch
             Coarse disclosure only (or absent)
             24–144h randomized delay after close/lock

隨機延遲機制:視窗 1 與視窗 2 及 3 的比較

為了防止觀察者將應用程式內交易的確切毫秒數與接收歸因回傳的時間進行關聯的計時攻擊啟發法,Apple 採用了隨機發送延遲:

  • 視窗 1 計時器:若視窗 1 在沒有提早鎖定的情況下自然關閉,則第一次回傳會在額外隨機延遲 24 到 48 小時後發送。
  • 視窗 2 與 3 計時器:Apple 將隨機延遲視窗擴大至 24 到 144 小時(最長 6 個完整天),以配合衡量期間的延長。

回傳資料層級如何控制揭露

官方回傳資料層級矩陣

Apple 根據與來源應用程式或網域相關聯的群體、獲客應用程式、安裝國家/地區以及階層式來源識別碼,為應用程式下載指派回傳資料層級(從第 0 層到第 3 層)。Apple 未針對第 0 層到第 3 層發布通用的安裝次數閾值。

回傳資料層級 第一次回傳(視窗 1) 第二次與第三次回傳(視窗 2 與 3)
第 3 層 2、3 或 4 位數來源 ID + 精細數值(若有提供)+ 符合資格的來源/國家/地區後設資料 2 位數來源 ID + 粗略數值(若有提供)
第 2 層 2、3 或 4 位數來源 ID + 精細數值(若有提供) 2 位數來源 ID + 粗略數值(若有提供)
第 1 層 2 位數來源 ID + 粗略數值(若有提供) 2 位數來源 ID + 粗略數值(若有提供)
第 0 層 僅 2 位數來源 ID(無轉換數值) 不發送第二次或第三次回傳

企業比較矩陣圖表,在溫暖乳白色網格背景上說明 SKAdNetwork 4.0 從第 0 層到第 3 層的回傳資料層級揭露規則與清晰的狀態標籤。

階層式來源識別碼如何運作

來源識別碼的結構與細緻度

SKAdNetwork 4.0 以稱為來源識別碼的 4 位數階層式整數取代了舊有的 2 位數廣告活動 ID:

Source Identifier=d4d3d2d1(0000 to 9999)\text{Source Identifier} = d_4 d_3 d_2 d_1 \quad (0000 \text{ to } 9999)

廣告聯播網與開發者根據內部報表需求來定義階層式來源識別碼的含義:

  • 低位兩碼(d2d1d_2 d_1:構成階層式來源識別碼中可能被揭露的最低兩位數部分。廣告聯播網可將此部分用於廣泛的廣告活動分群,但 Apple 未規定固定的商業含義。
  • 高位碼(d4d3d_4 d_3:可編碼內部維度,例如廣告版位、素材內容 ID 或地理目標。Apple 不會為個別位數指定固定的商業語意。

技術架構圖表,在溫暖柔和的乳白色網格背景上,將 4 位數 SKAdNetwork 4.0 階層式來源識別碼拆解為 2 位數與 4 位數揭露狀態。

Original Source Identifier: [ d4 ] [ d3 ] [ d2 ] [ d1 ]

Possible disclosed forms in first winning postback:
2-digit disclosure:          [ d2 ] [ d1 ]
3-digit disclosure:    [ d3 ][ d2 ] [ d1 ]
4-digit disclosure: [ d4 ][ d3 ][ d2 ] [ d1 ]

The exact number of digits disclosed depends on Apple's postback data tier.

廣告活動整合可能會增加與特定來源識別碼相關聯的群體規模,但 Apple 未發布通用的安裝閾值,且整合並不保證能獲得特定的回傳資料層級。

精細與粗略轉換數值

精細轉換數值

精細轉換數值作為 6 位元二進位數字運作,代表 0 到 63 的整數(26=642^6 = 64 個離散數值)。精細數值嚴格僅在第 2 層或第 3 層回傳資料層級下的視窗 1 中提供,可讓開發者編碼精細的營收區間、漏斗階段或位元運算事件組合。

粗略轉換數值

當適用的回傳資料層級不允許精細揭露時,粗略轉換數值可提供較低細緻度的替代方案,並作為第二與第三次回傳的轉換數值格式。Apple 未對 lowmediumhigh 指定預先定義的商業語意;以下範例為應用程式定義的對應說明:

  • low:基礎互動的對應說明(例如初始應用程式開啟或註冊)。
  • medium:中階互動的對應說明(例如完成教學或多日活躍工作階段)。
  • high:高價值轉換里程碑的對應說明(例如應用程式內購買或試用啟用)。

關於特定實作的轉換結構描述設計,請參閱 SKAN 轉換對應說明文件

回傳順序索引對應

在 SKAdNetwork 4 回傳中,postback-sequence-index 欄位可用於識別對應的轉換視窗:

postback-sequence-index 對應的轉換視窗 允許的轉換數值格式
0 視窗 1(首次開啟後第 0–2 天) 精細(0–63)或粗略(lowmediumhigh
1 視窗 2(首次開啟後第 3–7 天) 僅限粗略(lowmediumhigh)(或省略)
2 視窗 3(首次開啟後第 8–35 天) 僅限粗略(lowmediumhigh)(或省略)

Apple 規範安裝驗證回傳可以包含 conversion-value(精細)或 coarse-conversion-value(粗略),但兩者絕不能同時出現。

以下酬載為說明性質的 SKAdNetwork 4 範例。實際的回傳欄位會因回傳順序、回傳資料層級、廣告類型與隱私揭露條件而異。範例中的 attribution-signature 數值僅為預留位置,並非密碼學上有效的簽章。

以下範例 1 說明視窗 1 精細回傳酬載,範例 2 說明視窗 2 粗略回傳酬載:

{
  "version": "4.0",
  "ad-network-id": "example123.skadnetwork",
  "source-identifier": "4821",
  "app-id": 1234567890,
  "transaction-id": "6a8b1c2d-3e4f-5a6b-7c8d-9e0f1a2b3c4d",
  "postback-sequence-index": 0,
  "conversion-value": 47,
  "fidelity-type": 1,
  "did-win": true,
  "attribution-signature": "MEQCIFz8...SAMPLE_CRYPTOGRAPHIC_SIGNATURE...=="
}
{
  "version": "4.0",
  "ad-network-id": "example123.skadnetwork",
  "source-identifier": "48",
  "app-id": 1234567890,
  "transaction-id": "6a8b1c2d-3e4f-5a6b-7c8d-9e0f1a2b3c4d",
  "postback-sequence-index": 1,
  "coarse-conversion-value": "high",
  "fidelity-type": 1,
  "did-win": true,
  "attribution-signature": "MEQCIFz8...SAMPLE_CRYPTOGRAPHIC_SIGNATURE...=="
}

提早鎖定轉換視窗的權衡

使用 lockWindow 參數加速衡量

預設情況下,每個衡量視窗在其完整的日曆期間內保持開啟(視窗 1 為 48 小時,視窗 2 為 5 天,視窗 3 為 28 天)。當 lockWindowtrue 時,該次更新會成為活躍視窗的最終轉換數值更新。系統會準備回傳,並忽略該視窗剩餘時間內的額外轉換數值更新。

技術圖表,在溫暖柔和的乳白色網格背景上比較 SKAdNetwork 4.0 中預設 48 小時衡量視窗與提早視窗鎖定加速。

Default Window 1 (No Lock):
[First Launch] ─────────────── 48 Hours Open ───────────────► [Closes] ──► Delay (24-48h) ──► Postback 1

Locked Window 1 (Purchase at Hour 6):
[First Launch] ── 6h (Lock: true) ──► [Conversion Value Locked / Postback Prepared] ──► Delay (24-48h) ──► Postback 1 Sent Sooner

叫用視窗鎖定時的營運考量

  • 加速回傳發送:當轉換提早完成時,回傳延遲會在鎖定的轉換完成時立即開始計算,而不需要等待完整的日曆視窗結束。
  • 視窗獨立性:鎖定當前視窗並不會將下一個視窗的開始時間往前推進。下一個轉換視窗仍在其預定義的時間邊界開始(例如,無論視窗 1 何時被鎖定,視窗 2 都在第 3 天開始)。
  • 後續事件鎖定:一旦執行 lockWindow: true,作業系統就會忽略該特定視窗剩餘時間內的所有後續轉換數值更新呼叫。

以下的 Swift 程式碼示範如何更新精細與粗略轉換數值,以及如何使用 StoreKit 叫用視窗鎖定:

import Foundation
import StoreKit

enum SKANError: Error {
    case invalidFineValue
    case unsupportedOSVersion
}

final class SKAN4Manager {

    static let shared = SKAN4Manager()
    private init() {}

    /// Updates conversion values and optionally locks the active SKAN 4.0 window
    /// - Parameters:
    ///   - fineValue: 6-bit integer (0 to 63) for Window 1. Note: In Windows 2 and 3, SKAdNetwork ignores the fineValue parameter.
    ///   - coarseValue: Coarse value string ("low", "medium", "high") for all windows
    ///   - shouldLock: Boolean flag to immediately finalize the active window
    func updateConversionState(
        fineValue: Int,
        coarseValue: SKAdNetwork.CoarseConversionValue,
        shouldLock: Bool,
        completion: ((Error?) -> Void)? = nil
    ) {
        guard #available(iOS 16.1, *) else {
            completion?(SKANError.unsupportedOSVersion)
            return
        }

        // Validate fine-grained value bounds (0 to 63)
        guard (0...63).contains(fineValue) else {
            completion?(SKANError.invalidFineValue)
            return
        }

        // Execute asynchronous SKAN 4.0 conversion update
        SKAdNetwork.updatePostbackConversionValue(
            fineValue,
            coarseValue: coarseValue,
            lockWindow: shouldLock
        ) { error in
            if let error = error {
                print("SKAN 4.0 update failed: \(error.localizedDescription)")
            } else {
                print("SKAN 4.0 update succeeded - Fine: \(fineValue), Coarse: \(coarseValue.rawValue), Locked: \(shouldLock)")
            }
            completion?(error)
        }
    }

    /// Illustrative revenue mapping workflow (Do not copy specific thresholds directly to production)
    /// Note: In production, determine the active conversion window and define window-specific coarse-value logic.
    func handleInAppPurchase(amountUSD: Double) {
        let fineVal: Int
        let coarseVal: SKAdNetwork.CoarseConversionValue
        let lock: Bool

        switch amountUSD {
        case 0.0..<5.0:
            fineVal = 10
            coarseVal = .low
            lock = false
        case 5.0..<25.0:
            fineVal = 25
            coarseVal = .medium
            lock = false
        case 25.0...:
            fineVal = 60
            coarseVal = .high
            // Lock window immediately to expedite postback preparation for high-value conversion
            lock = true
        default:
            fineVal = 0
            coarseVal = .low
            lock = false
        }

        updateConversionState(fineValue: fineVal, coarseValue: coarseVal, shouldLock: lock)
    }
}

SKAdNetwork 4.0 與 AdAttributionKit 的互通性

SKAdNetwork 與 Apple AdAttributionKit 之間的關係

Apple 推出 AdAttributionKit 作為適用於 iOS 17.4 及更新版本的擴充歸因框架。AdAttributionKit 與 SKAdNetwork 可以並存,但它們維持各自獨立的歸因 API:

  • 框架專屬的 API 叫用:應用程式應叫用與廣告聯播網所使用框架相對應的轉換更新 API。若廣告聯播網透過 AdAttributionKit 提供廣告,應用程式即叫用 AdAttributionKit 轉換方法;若使用 SKAdNetwork,則叫用 StoreKit API。
  • 跨框架勝出者選擇:當兩個框架同時為單一安裝記錄符合資格的曝光時,作業系統會對其進行綜合評估,並選出單一勝出曝光進行歸因。
  • 橋接行為:Apple 針對特定的 SKAdNetwork 更新呼叫提供轉換數值橋接行為,以確保跨衡量層級的相容性。

SKAdNetwork 4 對於營運現有的 App Store 歸因整合仍然重要,而 Apple 則引導新的應用程式廣告實作轉向 AdAttributionKit,並記錄了兩個框架之間的互通性。

比較矩陣:舊版 SKAN 3.0 與 SKAN 4.0 多視窗模型

功能維度 舊版 SKAdNetwork 3.0 SKAdNetwork 4.0
勝出回傳次數 一次回傳 最多三次勝出回傳
衡量時間軸 最近一次符合資格的遞增更新後的 24 小時滾動計時器 長達 35 天(自首次開啟起算的三個視窗)
來源 ID 結構 2 位數整數(00 到 99) 階層式 4 位數來源 ID(2、3 或 4 位數)
轉換數值細緻度 僅限 6 位元整數(0 到 63) 精細(0 到 63)+ 粗略(lowmediumhigh
提早完成 不支援 透過視窗鎖定 API 支援(lockWindow: true
網頁轉應用程式歸因 不支援 支援 Safari 中可歸因的網頁廣告

常見問題 (FAQ)

應用程式可以在視窗 2 或視窗 3 收到精細轉換數值嗎?
不行。根據 SKAdNetwork 4.0 規格,精細轉換數值(0 到 63 的 6 位元整數)僅在第一個回傳視窗(0–2 天)中提供,前提是適用的回傳資料層級為第 2 層或第 3 層。視窗 2 與 3 會傳回粗略數值(`low`、`medium`、`high`)或省略該欄位。
若應用程式沒有提早鎖定回傳視窗會發生什麼事?
若應用程式沒有叫用 `lockWindow: true`,視窗將在其完整指定的期間內保持開啟(視窗 1 為 48 小時,視窗 2 為 5 天,視窗 3 為 28 天)。一旦視窗自然關閉,Apple 便會套用指定的隨機延遲,然後再將回傳發送給廣告聯播網;若獲客應用程式已設定開發者回傳端點(`NSAdvertisingAttributionReportEndpoint`),則會同時發送開發者副本。
SKAdNetwork 4.0 需要 App Tracking Transparency 授權提示嗎?
不需要。使用 SKAdNetwork 本身並不需要 ATT 授權,因為 SKAdNetwork 提供隱私保護歸因,且不會暴露持續性的跨應用程式廣告識別碼。

總結與決策框架

SKAdNetwork 4.0 將歸因能見度延長至自首次開啟應用程式起算 35 天,並導入粗略轉換數值以便在精細揭露無法取得時提供較低細緻度的衡量,同時允許開發者鎖定衡量視窗,在轉換視窗提早完成時減少回傳延遲。成功的實作需要在所有三個視窗中進行謹慎的轉換結構描述對應,並將客戶端更新呼叫與真實的商業里程碑保持一致。

應用程式層級的深度連結路由可以與 Apple 的隱私保護歸因框架並行運作,作為獨立的衡量與引導層級。關於特定實作的深度連結路由與歸因工作流程,請參閱 OpoInstall 說明文件

相關資料

  • 概念:多視窗歸因、回傳資料層級、階層式來源識別碼、視窗鎖定、粗略數值

  • 技術:Apple SKAdNetwork、Apple AdAttributionKit、StoreKit 框架、OpoInstall 行銷 SDK

  • 標準:IETF RFC 8259 JSON 規格

  • API:StoreKit updatePostbackConversionValue API、SKAdNetwork 安裝驗證回傳

官方說明文件

Share this article