












延迟深度链接是一种特殊的技术,能够确保无论用户是否已经安装了对应的 App,都能在点击链接后,被引导到 App 内特定页面或内容,而不是仅仅打开 App 首页。
普通深度链接适用于用于已经安装 App 的场景,核心目标是唤端和跳转。
sequenceDiagram participant User as 用户 participant App as 目标App participant Web as 网页/广告 Note over User, App: 前提:App已安装 User->>Web: 1. 点击一个深度链接 Note over Web: 链接格式为:<br>myapp://goods/123 Web->>App: 2. 系统直接唤醒App App->>App: 3. 解析链接参数 App->>User: 4. 直接跳转到指定页面
延迟深度链接解决了用户未安装 App 的问题,核心目标是引导下载后并安装后,用户还会被引导到 App 内特定页面或内容。
sequenceDiagram participant User as 用户 participant App as 目标App participant Web as 智能落地页 participant Server as 后端服务器 participant Store as 应用商店 User->>Web: 1. 点击广告/链接 Web->>Server: 2. 上报设备信息<br>生成唯一Link ID Note over Server: 存储映射关系:<br>Link ID -> 目标页面 Server->>Web: 返回Link ID Web->>Web: 3. 检测App安装状态 alt 已安装 Web->>App: 3a. 直接唤醒并跳转 else 未安装 Web->>User: 3b. 引导下载 User->>Store: 4. 前往应用商店 User->>Store: 5. 下载并安装App end User->>App: 6. 首次启动App App->>Server: 7. 上报设备信息/Link ID Server->>Server: 8. 智能匹配<br>查询目标页面 Server->>App: 返回最初的目标链接 App->>App: 9. 解析链接 App->>User: 10. 跳转到指定页面
业界最主流和成熟的方案通常基于“指纹识别”和“唯一标识符传递”的组合。其核心思想和工作流程如下:
flowchart LR subgraph A [第一阶段 用户点击] direction LR A1[用户点击<br>延迟Deeplink链接] --> A2[浏览器打开<br>跳转着陆页] end subgraph B [第二阶段 身份关联] direction LR B1[收集设备指纹<br>e.g., IP, UA, OS] --> B2[生成唯一标识符<br>e.g., Fingerprint ID] end subgraph C [第三阶段 意图暂存] direction LR C1[将 Fingerprint ID<br>与目标页面URL<br>关联存储于服务器] end subgraph D [第四阶段 意图还原] direction LR D1[App首次启动<br>收集设备指纹] --> D2[发送指纹至服务器<br>查询匹配的URL] --> D3[服务器返回<br>目标URL] --> D4[App直接跳转<br>至目标页面] end A --> B B --> C C --> D
着陆页需要完成两项核心任务:
收集设备指纹:通过 JavaScript 代码,尽可能多地收集能标识该设备的匿名信息,例如:
生成唯一标识符:
Fingerprint ID -> Target URL 的映射关系会被保存在服务器端,并通常会设置一个过期时间(例如24小时)。这是实现“延迟”跳转的最后一步:
业界通常借助成熟的第三方服务,例如 Branch.io、AppsFlyer、Adjust、Firebase Dynamic Links。
quadrantChart title 移动增长平台核心定位矩阵 x-axis "偏重归因与效果衡量" --> "偏重用户互动与体验" y-axis "偏重第三方视角" --> "偏重第一方视角" "Adjust": [0.2, 0.8] "AppsFlyer": [0.3, 0.75] "Branch.io": [0.7, 0.4] "Firebase Dynamic Links": [0.8, 0.2]
| 特性 | AppsFlyer | Adjust | Branch.io | Firebase Dynamic Links |
|---|---|---|---|---|
| 核心价值 | 归因与营销分析 | 归因与营销自动化 | 跨平台身份与用户体验 | 免费的深度链接 |
| 商业模式 | 第三方/SaaS | 第三方/SaaS | 第三方/SaaS | 第一方/免费 |
| 强项 | 多渠道归因、反欺诈、数据深度 | 归因精度、自动化、iOS解决方案 | 延迟深度链接、用户身份图、有机增长 | 免费、简单、与Google生态集成 |
| 弱项 | 价格较高,功能复杂 | 价格较高 | 在纯付费广告归因领域,品牌知名度略低于前两者 | 功能单一,无独立归因 |
| 理想客户 | 大型买量广告主,寻求中立数据 | 注重技术和自动化的大型应用 | 所有注重用户体验和跨平台身份识别的应用 | 预算有限的开发者,Firebase用户 |
作为移动归因和营销分析领域的领导者,AppsFlyer 的解决方案非常成熟和典型,其核心是 ”基于链接的标识符传递与智能匹配“。
通过 OneLink ID 来唯一关联一次点击事件。
flowchart LR subgraph A [第一阶段 点击与链接解析] A1[用户点击<br>含af参数的OneLink] --> A2[请求AppsFlyer服务器<br>生成唯一OneLink ID] end subgraph B [第二阶段 设备识别与引导] B1[服务器返回<br>跳转逻辑] --> B2{判断App安装状态} B2 -- 已安装 --> B3[直接唤醒App<br>并传递数据] B2 -- 未安装 --> B4[引导至应用商店<br>同时存储OneLink ID<br>与设备指纹的映射] end subgraph C [第三阶段 安装后首次启动] C1[App首次启动<br>AppsFlyer SDK初始化] --> C2[收集设备信息<br>并上报至AppsFlyer] end subgraph D [第四阶段 智能匹配与深度跳转] D1[AppsFlyer服务器<br>智能匹配OneLink ID] --> D2[服务器下发给App<br>原始的深度链接数据] --> D3[App执行最终<br>的深度跳转] end A --> B B --> C C --> D
af_dp=yourapp://product/123:指定App内目标页面。af_web_dp=https://example.com:指定App未安装时的网页备选方案。pid=facebook:标记广告渠道。c=campaign_name:标记广告活动。OneLink ID,并开始记录这次点击事件的所有数据。AppsFlyer服务器会根据设备情况做出智能路由:
情况A:App 已安装
情况B:App未安装
引导下载:服务器将用户引导至应用商店(App Store/Google Play)。
OneLink ID与设备信息的关联:OneLink ID。OneLink ID 和必要的链接数据以加密形式写入设备的系统剪贴板。这是实现“延迟”的魔法步骤:
OneLink ID 和完整的点击数据。af_dp 等参数,并将用户导航到对应的商品详情页、活动页或内容页。当用户点击了多个广告但未安装时,AppsFlyer需要解决一个关键的“多触点归因”问题,以确定是哪个广告最终导致了安装。
flowchart TD A[用户点击多个广告后安装App] --> B[AppsFlyer SDK<br>收集设备标识符] B --> C[AppsFlyer服务器执行<br>归因匹配分析] C --> D{Last-Touch归因<br>是否可用?} D -- 是<br>有确定的最后点击 --> E[成功归因<br>引导至对应广告的目标页面] D -- 否<br>无精确匹配 --> F[启用概率模型/聚合数据] F --> G[基于权重分配归因<br>e.g., 第一个和最后一个点击权重更高] G --> H[选择一个“最可能”的广告<br>并引导至其目标页面]
核心归因机制:Last-Touch(最后触点)归因
在理想情况下,AppsFlyer默认使用 “最后触点归因” 模型。这是行业标准,也是最直接的方法。
工作原理:
举例说明:
设备123 的最后点击 = 广告A。设备123 的最后点击 = 广告B。设备123 查询,找到最后点击是广告B。然而,现实情况往往更复杂,AppsFlyer有相应的策略来处理。
广告主可以设置一个 “归因回溯窗口期” (例如7天或30天)。AppsFlyer只会在这个时间窗口内寻找最后一次点击。
在无法使用精确设备标识符的情况下(例如用户在iOS上拒绝追踪),AppsFlyer会采用概率性归因。
在iOS的隐私框架下,精确的、跨应用的归因已被禁止。AppsFlyer严重依赖Apple的SKAdNetwork。
工作原理:
如何关联目标页面?
OneLink ID 既用于实现延迟深度链接,也用于完成安装归因。广告主可以清晰地知道,这个用户是由哪个渠道、哪个广告带来的,并且其后续行为(如购买、注册)都能被准确追踪。总结来说,AppsFlyer的延迟深度链接架构是一个以 OneLink ID 为核心、结合了多种设备识别技术和智能匹配算法的复杂系统。它不仅仅是一个跳转工具,更是一个集成了营销归因、用户行为分析的全链路解决方案,为移动广告的精准投放和效果衡量提供了坚实的技术基础。
在国内,由于谷歌和苹果的原生服务(Google Play Services、IOS Universal Links)收到网络环境或本地化替代的影响,需要开发者采用一套适应国内生态的组合拳。
国内实现延迟深度链接的技术核心是“多渠道标识符匹配 + 备用方案兜底”。
flowchart TD subgraph A [第一阶段 用户点击] A1[用户点击短链/二维码] --> A2[请求短链服务器<br>解析原始URL与参数] end subgraph B [第二阶段 环境探测与引导] B1[服务器或端探测设备环境<br>e.g., 操作系统, 是否安装App] --> B2[生成并存储<br>唯一链接ID] B2 --> B3{判断App安装状态} B3 -- 已安装 --> B4[通过App Scheme<br>或Universal Link唤醒] B3 -- 未安装 --> B5[引导至对应<br>应用商店下载] end subgraph C [第三阶段 安装后匹配] C1[App首次启动<br>SDK收集设备信息上报] --> C2[服务器进行智能匹配<br>e.g., 链接ID, 设备指纹] end subgraph D [第四阶段 意图还原与跳转] D3[匹配成功] --> D4[服务器下发<br>深度链接数据] D4 --> D5[App解析数据<br>并跳转至目标页面] end A --> B B --> C C --> D
当用户点击短链后,会访问一个智能跳转中间页。这个页面是技术核心,负责:
Link ID,并与设备信息(指纹)一起暂存在服务器。这是实现“延迟跳转”的关键。当用户安装App后首次打开时,集成在App中的SDK会工作:
SDK初始化事件上报到延迟深度链接的服务端。Link ID和设备指纹进行匹配。匹配成功后,即可确定用户最初想访问的目标页面。服务端将匹配成功的深度链接数据(目标URL和参数)下发给App。App接收到数据后,解析并跳转到对应的内部页面。
核心标识符:OAID
备用方案:剪贴板
多渠道商店跳转
自建 vs. 第三方服务
自建:大型公司(如阿里、腾讯、字节)拥有自己的技术团队,会自建整套系统,以更好地与自身业务集成。
第三方服务:中小型公司更倾向于使用成熟的第三方服务,例如
这些服务提供了封装好的SDK,处理了复杂的匹配逻辑和应用商店跳转,开箱即用。
目前业界并没有一种百分之百完美的方法,而是采用一套分层、概率性的综合判断策略,其核心决策流程可以概括为下图所示的步骤:
flowchart TD A[用户点击广告] --> B[Landing Page<br>加载并执行检测] B --> C{尝试通过URL Scheme<br>唤醒App} C -- 成功 --> D[判断为“已安装”] C -- 超时/失败 --> E[判断为“未安装”] D & E --> F[执行相应操作<br>唤端或跳转商店] F --> G[上报检测结果<br>用于优化模型]
这是目前最主流的方法,原理是利用自定义URL Scheme尝试唤醒App,并根据反应来判断。
<iframe>或直接使用window.location,跳转到目标App的自定义URL Scheme(例如 yourapp://)。document.hidden等属性)。如果页面仍然活跃,则判断为“未安装”;如果页面在超时前就已失去焦点/被挂起,则判断为“已安装”。这是苹果和安卓提供的官方方案。
app_installed=true)。标准流程:
首选方案:对于新用户,默认使用前端异步探测。
官方方案辅助:同时配置Universal Links/App Links作为补充或主要唤端方式。
本地缓存优化:对于检测到已安装的用户,在本地做标记,下次直接唤端,提升效率。
兜底方案:
当判断为“未安装”时,显示下载按钮,引导用户去应用商店。
在引导下载的过程中,使用剪贴板将深度链接参数复制下来,确保用户安装后打开App能直达目标页面,实现延迟深度链接。
数据反馈与优化:
将前端检测的结果(无论成功与否)上报给数据分析平台。
结合最终的归因数据(即用户是否真的安装了App),来不断校准和优化前端探测的超时时间等参数,形成一个闭环优化系统。
这是最简单、最直接的方式。原理是:在App的私有存储空间(如 SharedPreferences on Android, UserDefaults on iOS, 或本地文件)中,写入一个特定的标志位。
is_first_launch)。true(或一个时间戳)。true,App便知道这不是第一次运行,从而跳过引导页等逻辑。有时我们不仅需要知道是不是App生命周期的“第一次”,还需要知道是不是当前这个新版本的第一次运行。这通过对比版本号实现。
工作流程:
last_version_code)。current_version_code)。last_version_code 不存在 → 全新安装。last_version_code < current_version_code → 版本升级。last_version_code == current_version_code → 常规启动。在广告投放场景下,识别“第一次安装”至关重要,这直接关系到广告效果的归因(判断用户是从哪个广告渠道来的)。这个能力主要由第三方归因SDK提供,如 AppsFlyer, Adjust, 友盟+ 等。
这种方式不仅能识别出是第一次安装,还能精确地告诉广告主,这次安装是来自于哪个广告渠道(例如:抖音、百度或Google Ads)。
第一作者:AI
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。