SKAdNetwork 4.0 指南:三大回传窗口的工作原理

opoinstall
2026-08-19
5 min read

SKAdNetwork 4.0 多窗口归因是如何工作的?SKAdNetwork 4.0 将转化监测划分为三个连续的窗口,分别覆盖 App 首次启动后的第 0-2 天、第 3-7 天和第 8-35 天。苹果会为每次 App 下载分配一个回传数据层级,该层级决定了符合条件的回传数据是包含细粒度数据、粗粒度数据还是精简后的归因数据。

SKAdNetwork 4.0 是苹果推出的隐私保护型移动广告归因框架,旨在 iOS 上实现隐私安全的广告活动效果衡量。它引入了持续长达 35 天的三个连续转化窗口、分层来源标识符、粗粒度转化值以及窗口锁定机制,无需收集持久化的设备身份信息即可评估用户生命周期价值(LTV)的中段表现。

术语 定义
SKAdNetwork 苹果用于隐私保护型广告活动归因的平台级框架。
转化窗口 从 App 首次启动开始计算的三个指定监测周期之一,在此期间被推广的 App 可以更新转化值。
回传数据层级 由平台分配的层级(从 Tier 0 到 Tier 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 小时随机延迟后分发。
  • Tier 0 数据限制:落入 Tier 0 的下载会收到包含 2 位数来源 ID 且无转化值的单个回传;第二和第三次回传会被省略。
  • 多回传要求:要符合接收多个有效回传的条件,广告必须使用 SKAdNetwork 4 或更高版本进行签名,且被推广的 App 必须在适用的转化窗口内更新转化值。

什么是 SKAdNetwork 4.0 以及多窗口归因的运作方式

从单定时器限制到多窗口生命周期追踪的结构演进

苹果 StoreKit Ad Network 的早期版本(SKAdNetwork 2.0 和 3.0)运行在单一的 24 小时滚动定时器下。在 SKAdNetwork 3 及更早版本中,有效的递增转化值更新可以通过重新启动 24 小时定时器来延长滚动转化期。一旦经过 24 小时没有更新,窗口就会关闭,苹果会在随机延迟后分发单个回传。

这种单定时器架构带来了运营摩擦:

  • 受限的观察视野:广告主只能衡量安装后最初几天发生的早期互动。
  • 报告延迟:反复的合格转化更新可能会延长实际监测期并延迟最终回传,从而减慢自动化广告出价算法的速度。
  • 长尾可见性有限: SKAdNetwork 3 没有专门用于第 7 天到第 30 天结构化监测的后续转化窗口。

SKAdNetwork 4.0 通过建立以用户首次应用启动为锚点的三个固定、连续的监测窗口,重构了这一模型。

将归因定时器与活跃用户会话解耦

在 SKAdNetwork 4.0 中,转化窗口根据固定的日历时长推进,而不是根据连续的用户活动。当用户在看到归因广告展示后首次打开 App 时,操作系统将启动窗口 1。

无论用户在头 48 小时内打开 App 一次还是五十次,窗口 1 都会在 48 小时大关关闭(除非通过窗口锁定显式提前终结)。随后,系统自动进入窗口 2(第 3 天到第 7 天),接着是窗口 3(第 8 天到第 35 天)。这种解耦保证了下游数据管道具有结构化的回传分发间隔。

双层密码学签名链

SKAdNetwork 在两个不同的阶段使用公钥密码学来维护数据完整性:

  • 广告展示环节(广告网络到苹果):当广告网络展示广告时,它会使用其私钥对广告 payload 进行签名。在 App 安装并启动时,操作系统会针对苹果注册的广告网络公钥验证此签名,以核实归因资格。
  • 安装验证环节(苹果到广告网络/开发者):当转化窗口关闭时,苹果会对安装验证回传 payload 进行签名。接收方广告网络和开发者端点使用苹果的公钥验证此签名,以核实回传的真实性和完整性。

另请参阅:SKAdNetwork ──> 移动归因模型

三个回传窗口的机制与监测时间线

窗口 1:捕获早期互动与高精度转化信号

  • 监测区间:第 0 天到第 2 天(首次启动后的前 48 小时)。
  • 可用的数据披露:细粒度转化值(0 到 63 的 6 位整数)或粗粒度值(lowmediumhigh),由分配的回传数据层级决定。
  • 随机回传延迟:窗口关闭或锁定后 24 到 48 小时。
  • 分析目标:衡量即时新手引导完成度、教程里程碑、初始购买转化以及早期流失风险。

Window 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 天)。
  • 分析目标:捕获首月留存基准、试用到付费订阅的转化以及长尾变现里程碑。

展示 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 的对比

为了防止观察者通过将应用内交易的精确毫秒与收到归因回传的时间相关联来进行计时攻击启发式分析,苹果采用了随机分发延迟:

  • 窗口 1 定时器:如果窗口 1 在没有提前锁定的情况下自然关闭,第一个回传将在额外的 24 到 48 小时随机延迟后发送。
  • 窗口 2 和窗口 3 定时器:苹果将随机延迟窗口扩大到 24 到 144 小时(最多 6 个完整天),以适应监测周期的延长。

回传数据层级如何控制数据披露

官方回传数据层级矩阵

苹果根据与来源 App 或域、被推广 App、安装国家以及分层来源标识符相关联的群体规模,为 App 下载分配回传数据层级(Tier 0 到 Tier 3)。苹果并未公布 Tier 0 到 Tier 3 的通用安装量阈值。

回传数据层级 第一次回传(窗口 1) 第二及第三次回传(窗口 2 和 3)
Tier 3 2、3 或 4 位数字来源 ID + 精细值(如果提供)+ 符合条件的来源/国家元数据 2 位数字来源 ID + 粗粒度值(如果提供)
Tier 2 2、3 或 4 位数字来源 ID + 精细值(如果提供) 2 位数字来源 ID + 粗粒度值(如果提供)
Tier 1 2 位数字来源 ID + 粗粒度值(如果提供) 2 位数字来源 ID + 粗粒度值(如果提供)
Tier 0 仅 2 位数字来源 ID(无转化值) 不发送第二或第三次回传

企业级比较矩阵图,阐述从 Tier 0 到 Tier 3 的 SKAdNetwork 4.0 回传数据层级披露规则,带有独特的状态徽章,背景为暖色奶油色网格。

分层来源标识符的工作原理

来源标识符的结构与粒度

SKAdNetwork 4.0 用称为来源标识符(Source Identifier)的 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):构成可披露的分层来源标识符的最低两位数部分。广告网络可将此部分用于广泛的广告系列分组,但苹果并未规定固定的商业含义。
  • 高阶数字 (d4d3d_4 d_3):可用于编码内部维度,例如广告版位、创意 ID 或地理目标。苹果不会为单个数字指定固定的商业语义。

技术架构图,将 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.

广告系列整合可能会增加与特定来源标识符相关的群体规模,但苹果并未公布通用的安装量阈值,且整合并不能保证获得特定的回传数据层级。

细粒度与粗粒度转化值

细粒度转化值

细粒度转化值充当 6 位二进制数,代表从 0 到 63 的整数(26=642^6 = 64 个离散值)。细粒度值仅在 Tier 2 或 Tier 3 回传数据层级下的窗口 1 中可用,允许开发者编码精细的收入范围、漏斗阶段或按位事件组合。

粗粒度转化值

当适用的回传数据层级不允许披露细粒度数据时,粗粒度转化值提供了一种低粒度的替代方案,并作为第二和第三次回传的转化值格式。苹果未对 lowmediumhigh 指定预定义的商业语义;以下示例为应用自定义映射的说明性示例:

  • low:基准互动的说明性映射(例如,初始 App 打开或注册)。
  • 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)(或不存在)

苹果规定,安装验证回传可以包含 conversion-value(细粒度)或 coarse-conversion-value(粗粒度),但绝不能同时包含两者。

以下 payload 是说明性的 SKAdNetwork 4 示例。实际回传字段因回传序列、回传数据层级、广告类型和隐私披露条件而异。示例中的 attribution-signature 值仅为占位符,不具备密码学有效性。

下面的示例 1 说明了窗口 1 细粒度回传 payload,示例 2 说明了窗口 2 粗粒度回传 payload:

{
  "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 与苹果 AdAttributionKit 之间的关系

苹果推出了 AdAttributionKit 作为针对 iOS 17.4 及更高版本的扩展归因框架。AdAttributionKit 和 SKAdNetwork 可以共存,但它们仍然是不同的归因 API:

  • 框架特定的 API 调用:App 应调用与广告网络所用框架相对应的转化更新 API。如果广告网络通过 AdAttributionKit 提供广告,App 会调用 AdAttributionKit 转化方法;如果使用 SKAdNetwork,则调用 StoreKit API。
  • 跨框架赢家选择:当两个框架都记录了单次安装的合格展示时,操作系统会对它们进行评估并选择单个获胜展示进行归因。
  • 桥接行为:苹果为某些 SKAdNetwork 更新调用提供转化值桥接行为,以确保跨监测层的兼容性。

对于运营现有 App Store 归因集成而言,SKAdNetwork 4 依然重要,而苹果则将新的 App 广告实现引导至 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)支持
Web-to-App 归因 不支持 支持 Safari 中可归因的网页广告

常见问题 (FAQ)

App 可以在窗口 2 或窗口 3 中接收细粒度转化值吗?
不可以。根据 SKAdNetwork 4.0 规范,细粒度转化值(0 到 63 的 6 位整数)仅在第一个回传窗口(0–2 天)中可用,前提是适用的回传数据层级为 Tier 2 或 Tier 3。窗口 2 和 3 返回粗粒度值(`low`、`medium`、`high`)或省略该字段。
如果 App 没有提前锁定回传窗口会发生什么?
如果 App 未调用 `lockWindow: true`,则窗口将保持打开状态直至其指定的完整持续时间(窗口 1 为 48 小时,窗口 2 为 5 天,窗口 3 为 28 天)。一旦窗口自然关闭,苹果就会在向广告网络分发回传之前应用指定的随机延迟,并且如果被推广的 App 已配置开发者回传端点(`NSAdvertisingAttributionReportEndpoint`),还会发送开发者副本。
SKAdNetwork 4.0 是否需要 App 跟踪透明度(ATT)授权提示?
不需要。使用 SKAdNetwork 本身不需要 ATT 授权,因为 SKAdNetwork 在不暴露持久化跨 App 广告标识符的情况下提供隐私保护型归因。

总结与决策框架

SKAdNetwork 4.0 将归因可见性扩展到自 App 首次启动起 35 天,引入了粗粒度转化值以便在细粒度披露不可用时提供低粒度监测,并允许开发者在转化窗口提前终结时锁定监测窗口以减少回传延迟。成功的实施需要在所有三个窗口中进行仔细的转化架构映射,并将客户端更新调用与真正的商业里程碑对齐。

应用级深度链接路由可以作为独立监测和引导层与苹果的隐私保护型归因框架并行运行。有关特定实现的深度链接路由和归因工作流,请参阅 OpoInstall 文档

相关材料

  • 概念:多窗口归因、回传数据层级、分层来源标识符、窗口锁定、粗粒度值

  • 技术:Apple SKAdNetwork、Apple AdAttributionKit、StoreKit 框架、OpoInstall 移动端 SDK

  • 标准:IETF RFC 8259 JSON 规范

  • API:StoreKit `updatePostbackConversionValue` API、SKAdNetwork 安装验证回传

官方文档

Share this article