
简介
深度链接是指当用户打开移动应用时向其提供个性化的内容,或将用户带到应用内特定位置的操作。通过这种操作,您可以为用户提供优质的用户体验,从而极大加强用户与应用的互动。
两种深度链接类型
由于用户不一定安装了移动应用,所以有两种深度链接类型:
- 深度链接(Deep Linking)
- 向已经安装了移动应用的现有用户直接展示个性化内容。
- 延迟深度链接(Deferred Deep Linking)
- 当新用户或已卸载的用户完成安装打开移动应用时向其展示个性化内容。
借助独特的设备检测追踪链接 - OneLink™,AppsFlyer 同时支持深度链接和延迟深度链接两种方式。
本指南涵盖你所需要了解的有关深度链接设置及操作的相关内容。
重要提示!
设置深度链接之前,需要正确设置OneLink。
请先阅读 OneLink™ 基础设置指南。
深度链接和 OneLink
OneLink 在广告和移动应用之间起到“桥梁”的作用。它可以启动应用并向移动开发者提供定制用户体验所必需的数据。要想实现这一点,移动应用在开发时必须具备深度链接功能和基础架构。
深度链接和访客找回
深度链接和 OneLink 是广告主用于与现有或曾经的用户进行再次互动(例如:访客找回)的主要工具。 关于访客找回的相关内容请参阅“访客找回指南”,相关操作在深度链接之后执行。

深度链接的方法
为了覆盖更全面的用户群体,可以选择多种深度链接方法。 使用的方法依移动平台(iOS/Android)以及用户的系统版本而定。
方法 | 描述 | 适用于 |
---|---|---|
URI Scheme | 直接打开应用并重定向至URL 参数中指定的af_dp
行为路径 |
|
通用链接Universal Links | 直接打开移动应用的特定页面。 需要移动开发者建立一个逻辑,根据 OneLink URL 参数进行重定向或者提供定制内容,例如 af_dp 或 af_sub1 |
iOS 9 及更高版本 |
App Links | Android 6 及更高版本 |
点击下方深度链接的不同方法,了解实施详情。
URI Scheme
URI Scheme本质上是URLs,用户点击链接后直接引导用户进入移动应用的特定页面。 例如: greatapp://
建议
Apple 和 Google 对于应用Scheme都不强制实施唯一命名。 为您的品牌选择一个独特的Scheme名称,以避免不同应用之间的Scheme发生冲突。
可以使用Scheme来创建较长的路径,自动将用户链接到应用内特定页面。 例如: greatapp://vintage_items/cars/flying_delorean
如果某应用的用户在浏览器的 URL 框中输入Scheme路径,会启动应用并进入具体页面。 AppsFlyer 使用 af_dp
参数,通过 OneLink URL 提供相同的 URI Scheme深度链接功能(必须encode)。示例: https://go.onelink.ly/qwerty?af_dp=greatapp%3A%2F%2Fvintage_items%2Fcars%2Fflying_delorean
重要提示!
为了使 OneLink 能够同时适用于 iOS 和 Android,必须为两个平台定义相同的Scheme。 请参阅 iOS 和 Android 的相关说明。
设置 URI Scheme
在应用的代码中设置URI Scheme,如下所示: 在 AppsFlyer 的 OneLink 模板页面也需设置相同的URI Scheme。
Android 所有版本
在应用的 Manifest 文件中,给相关的行为添加以下意图过滤器 (Intent-filter):
<activity android:label="@string/app_name" ….. >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="your unique scheme" />
</intent-filter>
</activity>
示例
<activity android:label="@string/greatapp" ….. >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="greatapp" />
</intent-filter>
</activity>
iOS 8 及更低版本
- 在 Xcode 中,打开应用信息 plist 文件。
- 添加 URL 类型条目
- 展开 URL 类型和“item 0”行,添加一个新行。
- 为应用添加一个唯一的标识符作为 URL 标识符。 最好选择一个不太可能被其他应用使用的独特标识符。
- 右键点击 URL 标识符,选择“添加行”,然后选择 URI Scheme并将 Item 0 的值设置为您特有的Scheme。
设置OneLink模板:
在 AppsFlyer 控制面板中,找到深度链接自定义 URL 方案(iOS8/Android 5 及更低版本)下面的 OneLink 配置界面,填入已定义的Scheme(例如,"scheme://")。
测试 URI Scheme
- 在您的设备上安装并运行应用。(或在iOS中使用iPhone 模拟器)
- 打开默认浏览器(iOS上的Safari),在地址栏中输入您的URL Scheme(例如,"greatapp://")。
- 移动应用按默认行为启动。
配置OneLink模板
打开OneLink 配置界面, 在“深度链接自定义 URL Scheme(iOS8/Android 5 及以下版本)" 中填入已定义的Scheme(例如, "greatapp://")。
通用链接
在 iOS 9 及更高版本中,Apple用通用链接替代 URI Scheme作为主要的深度链接方法。 这种方法的安全性更高,因为其他应用无法获取通用链接。 用户体验也更好,因为可以直接启动iOS应用,不会将用户先重定向至浏览器。
本质上,通用链接的方法是将iOS移动应用和相关的网站/域连接,例如 AppsFlyer 的 OneLink 域 (xxx.onelink.me)。 要实现这一点,需要执行以下步骤:
- 配置 OneLink 子域并链接到移动应用(通过托管 ‘apple-app-site-association’ 文件 - AppsFlyer 会处理好这一部分)
- 配置移动应用,注册已认证的域。
完成以上步骤后,每当用户点击一个已授权域的 URL 时(设备上已安装了该应用),iOS 会启动相关联的应用并打开相关页面。
建议
即使对于 iOS 9 以上的版本,仍然有必要实施 URI Scheme,因为有些浏览器或应用会不支持通用链接,仍需要使用URI Scheme的方法。
若要通过 OneLink 和通用链接使用深度链接,需要进行以下几个步骤:
配置 OneLink 子域并链接到应用
- 要完成这个步骤,开发者必须从 Apple Developer 门户网站(‘View Account >> Account Summary’ 下面)获取 ‘Team ID’(如果是多个 Team ID,则为 ‘App Prefix’)。
- 在应用的 AppsFlyer 控制面板/设置中,点击‘配置 OneLink’>>在‘iOS’ 下面勾选‘启用Universal Links支持深度链接’复选框,填入在第1步中获取的Team ID/App Prefix。
注意
对于开发中的应用,开发者也需要提供 iOS应用的Bundle ID
- 选择一个OneLink子域,将其填入额外配置下面的深度链接(iOS9/Android6或以上版本)子域字段中。
注意
由于子域可以随时更改,改后会导致使用原始子域的所有现有的 OneLink URL 失效。
配置移动应用,注册已认证的域
- 在 Apple Developer 门户网站的 Identifiers >> App IDs 下面,选择应用并启用关联域 (Associate Domain),然后生成应用的 Provisioning 文件,下载这些文件并双击安装到 Xcode 上。
- 在“功能”的Xcode中,启用已关联的域,填入在“OneLink 配置”(AppsFlyer 账户)中配置的 OneLink 域。
注意
该域必须以“applinks:”为前缀。例如:applinks:mydomain.onelink.me
Android 应用链接
Android 6.0 引入的这种方法是 Google 版通用链接,具有类似的优点。
但是,几乎所有的 iOS 用户都在使用 iOS 9 或更高版本,因而必须使用通用链接;但在 Android 上面,一半的用户仍然在使用 Android 6.0 以下的版本,因而必须使用 URI 方案实现深度链接。
由于 URI Scheme能够覆盖所有 Android 用户的深度链接,许多应用发行商都选择仅采用这种方法进行 Android 的深度链接。
不想采用应用链接的广告主通常也需要使用URI Scheme。
本文说明了如何实施 Android 应用链接。
深度链接的备选方案
深度链接可以提供优质的用户体验,失效的深度链接绝对不会!多种原因可导致深度链接失效,如配置错误或媒体平台上面的变化。
因此,我们强烈建议,在为深度链接创建Onelink的时候,同时做好备选方案。
af_ios_url和af_android_url可以将点击了Onelink的用户导向着陆页,而不是应用商店。但是当Onelink上面加入了深度链接,会优先打开深度链接的页面。
这意味着当使用深度链接的时候,可以同时放心加这些参数。如果深度链接正常工作,就可以让用户进入到相关页面;如果因为某些原因导致深度链接失效时,用户就会进入到设定的着陆页,比如商店页或主页,而不是直接导致页面崩溃。
更多信息,可参考重定向参数。
深度链接报告
深度链接是访客找回营销活动的关键组成部分。在很多情况下,访客找回营销活动会为找回的用户提供一些个性化的内容,例如优惠减免或者享受高级会员内容访问权限等。
为了让AppsFlyer能够处理和归因访客找回/深度链接的操作,当深度链接被调起时,应用开发者需要将其上报给AppsFlyer的SDK。

直接深度链接和延迟深度链接
当活跃用户点击OneLink时,可以通过深度链接将用户重定向至应用内的任何页面。
对于还未安装应用的潜在用户,如何为其提供同样的体验呢?
当潜在用户点击OneLink时,用户会被重定向至与设备类型匹配的应用商店,用户可以在该应用商店安装应用。 然后在首次打开应用时,无论用户点击的是什么广告,用户都可以被定向至指定的页面。
为了让所有用户(无论是现有用户还是新用户)都能有一样的深度链接体验,AppsFlyer 提供了延迟深度链接解决方案。
如上所示,当新用户首次启动应用时,AppsFlyer 会为应用提供归因信息,包括可能存在的任何深度链接数据。 应用开发者可以使用这些数据将新用户转至应用内的任何内容,就像对现有用户直接进行深度链接一样。
若要实执行延迟深度链接,请参阅此指南中的说明。
建议
如果您只是针对现有的移动用户进行深度链接营销活动,则无需使用延迟深度链接。 但是,如果您的目标群体中有相当一部分用户还没有安装您的应用(例如:近期卸载了应用的用户),那么使用延迟深度链接对于良好的用户体验和留存来说则是非常重要的。
通过onAppOpenAttribution 提供个性化内容
不管OneLink中包含什么参数,通用链接和应用链接都是按默认行为打开应用。如果想提供个性化内容或将现有用户转至应用内的特定位置,需要使用 onAppOpenAttribution SDK 函数。
onAppOpenAttribution 方法
onAppOpenAttribution 方法可以解析数据,通过iOS 中的NSDictionary <key, value>
(Hash Map) 对象或 Android中的Map <key, value>
对象返回数据。 当使用应用特定的追踪链接、URL Scheme或OneLink短链时,其值为 True。
但是,当用户使用通用链接或应用链接直接进行深度链接时,由于应用不用先通过AppsFlyer,而会直接打开,onAppOpenAttribution 方法将直接返回未解析的完整链接。
解析 URL 数据中的值并以程序化的方式提供内容或重定向至应用内的相应位置。
onAppOpenAttribution和 onConversionDataReceive必须注册到同一个类/委托上
注意
我们建议在此处还使用 af_dp
参数值,使所有深度链接有统一的逻辑。
对于这两种方法,开发者须按如下所示设置 AppsFlyer SDK 的跟踪代理:
AppsFlyerLib.getInstance().registerConversionListener(this, new AppsFlyerConversionListener() {
@Override
public void onInstallConversionDataLoaded(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d(AppsFlyerLib.LOG_TAG, "conversion_attribute: " + attrName + " = " +
conversionData.get(attrName));
}
}
@Override
public void onInstallConversionFailure(String errorMessage) {
Log.d(AppsFlyerLib.LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
@Override
public void onAppOpenAttribution(Map<String, String> conversionData) {
for (String attrName : conversionData.keySet()) {
Log.d(AppsFlyerLib.LOG_TAG, "onAppOpen_attribute: " + attrName + " = " +
conversionData.get(attrName));
}
}
@Override
public void onAttributionFailure(String errorMessage) {
Log.d(AppsFlyerLib.LOG_TAG, "error onAttributionFailure : " + errorMessage);
}
});
跟踪代理应在代理头文件中进行引用,如下所示:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AppsFlyerTrackerDelegate{
// ...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
AppsFlyerTracker.shared().appsFlyerDevKey = "repLaceWithYourDevKeY"
AppsFlyerTracker.shared().appleAppID = "123456789"
// ...
AppsFlyerTracker.shared().delegate = self
}
func onConversionDataReceived(_ installData: [AnyHashable: Any]) {
//Handle Conversion Data (Deferred Deep Link)
}
func onConversionDataRequestFailure(_ error: Error?) {
// print("\(error)")
}
func onAppOpenAttribution(_ attributionData: [AnyHashable: Any]) {
//Handle Deep Link Data
}
func onAppOpenAttributionFailure(_ error: Error?) {
}
@interface AppDelegate : UIResponder <UIApplicationDelegate, AppsFlyerTrackerDelegate>
在 AppDelegate.m 中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[AppsFlyerTracker sharedTracker].appsFlyerDevKey = @"repLaceWithYourDevKeY";
[AppsFlyerTracker sharedTracker].appleAppID = @"123546789";
[AppsFlyerTracker sharedTracker].delegate = self;
}
-(void)onConversionDataReceived:(NSDictionary*) installData {
//Handle Conversion Data (Deferred Deep Link)
}
-(void)onConversionDataRequestFailure:(NSError *) error {
NSLog(@"%@",error);
}
- (void) onAppOpenAttribution:(NSDictionary*) attributionData {
//Handle Deep Link
}
- (void) onAppOpenAttributionFailure:(NSError *)error {
NSLog(@"%@",error);
}
在 SRN 中使用深度链接
SRN(自报告广告平台,如 Facebook 和 Twitter)拥有自己专有的深度链接归因方法,不涉及外部归因服务跟踪URL。
那么,该如何和SRN平台的用户进行深度链接,并获取相关的数据呢?
在 SRN 中使用直接深度链接
SRN 使用自己的方式进行深度链接。
不幸的是,这意味着当 SRN 在用户的设备上执行深度链接时,不会调用 onAppOpenAttribution 方法。
因此,如果需要应用内的直接深度链接数据,应用发行商需要使用 SRN 的方法在应用启动时获取数据。
在 SRN 中使用延迟深度链接
相反,在 SRN 中使用延迟深度链接是可行的。
AppsFlyer 始终可以接收转化数据并在首次启动时向应用提供该数据。
对于点击了SRN的深度链接/访客找回营销活动而安装应用的新用户,可以通过使用转化数据,在用户启动应用的时候将其重定向至应用内的特定内容。
但是,面对SRN,常规的 AppsFlyer 深度链接参数,如 af_dp,不会作为深度链接数据的一部分呈现。
要在应用内使用此数据,开发者需要根据可用的参数(例如营销活动、广告组或单个广告名称)采用其他逻辑。
示例
一款应用的移动营销人员 Jill 决定在 Facebook 上针对普通用户进行深度链接的营销活动。
该营销活动会将点击链接的用户重定向至一个“奖励活动“页面。
移动开发者 Jack 在获取转化数据后添加了这一逻辑:
1. 是否来自 Facebook ("is_fb=true")?
2. 如果是,获取 Adgroup 的参数值。
3. 如果参数值包含“bonus”一词,则将用户转至“奖金活动“页面。
通过使用Facebook的方法,点击该广告的现有用户会被直接重定向至该活动页面,而新用户则通过AppsFlyer获取到的转化数据得到同样的体验——定向至该活动页面。
建立 OneLink URL
您可以基于OneLink模板创建和使用OneLink URL,数量不限:
- 进入相关应用的控制面板(例如,在 OneLink 相应模板中配置的一个应用)。
- 点击Link Management, 然后点击“添加自定义跟踪链接
- 选择跨平台Onelink
- 在总配置中填写链接名称
- 填写相关归因参数,如媒体平台名称、广告系列、广告组或其他子参数。
- 如要启用再营销,开启再营销广告活动按钮
- 根据需要,选择是否添加深度链接(deeplink) 或重定向参数
- 根据需要,可在高级部分自定义点击归因窗口期。
- 根据需要,可以在跟踪链接中设置固定的安装成本。
- 点击创建链接,复制该链接并将其用于您自己的媒体或任何其他相关媒体渠道
建议
自定义追踪链接窗口是一个用于创建 OneLink URL 的可选辅助功能。 您可以在记事本、Word、电子邮件等程序中离线创建自定义追踪链接。
测试 OneLink URL
要快速、轻松地测试深度链接,您可以使用:
- 对于 Android - AppsFlyer 的 SDK 对接测试应用
- 对于 iOS - 控制面板的 SDK 对接测试页面
此外,您也可以手动测试应用的深度链接。测试三种深度链接的方法如下所述。
针对URI Scheme,测试直接深度链接
- 在您的设备(或 iOS 中的 iPhone 模拟器)上安装并启动应用。
[如果刚刚安装应用,则将应用置于后台,然后再返回前台,重复两次或更多。] - 为应用准备一个 OneLink URL,应包含 af_dp 参数并且具有有效的方案路径(例如 "greatapp://cars")。
- 在测试设备上,将该链接粘贴到电子邮件、便签、短信、二维码生成器等程序中。
- 点击链接。
预期的结果:应用应按照 af_dp 打开指定的页面。
针对URI Scheme,测试延迟深度链接
- 退出应用。
- 删除应用。
- 为应用准备一个 OneLink URL,应包含 af_dp 参数(或另一个参数)并且具有有效的方案路径(例如 "greatapp://cars")。
- 在测试设备上,将该链接粘贴到电子邮件、便签、短信、二维码生成器等程序中。
- 点击链接。
- 在您的设备(或 iOS 中的 iPhone 模拟器)上安装并启动应用。
预期的结果:应用首次启动时成功获取该链接(转化数据)。可以提前 af_dp 参数,用户根据af_dp的值被重定向至应用内指定页面。
测试通用链接或 Android 应用链接
- 在您的设备(或 iOS 中的 iPhone 模拟器)上安装并启动应用。
[如果刚刚安装应用,则将应用置于后台,然后再返回前台,重复两次或更多。] - 为应用准备一个 OneLink URL,应包含 af_dp 参数(或另一个参数)并且具有有效的方案路径(例如 "greatapp://cars")。
- iOS - 将该链接粘贴到便签、iMessage 中,或使用 Apple Mail 客户端粘贴到电子邮件中。
Android - 将该链接粘贴到电子邮件、Chrome、短信、二维码生成器等程序中。不要使用 Slack、Facebook 或任何其他社交应用点击该链接! - 点击链接。
预期的结果:直接打开应用,不会通过浏览器进行重定向。可以提取 af_dp 参数,用户按照 af_dp 的值被重定向至应用内指定页面。
建议
在 iOS 设备上的反应异常?
1. 重启设备(关机后再重新开机) - 在 iOS 11 上,这一操作往往可以修复一些奇怪的授权问题。
2. 不要将链接粘贴到 Safari 中 - iOS 目前阻止从任何浏览器的地址栏进行深度链接。
3. 还有其他问题? 请参阅常见问答。
常见问答
是否可以不使用 OneLink 进行深度链接?
可以,但仅限于部分情况。 虽然 OneLink 是用于深度链接的一个必不可少的工具,但普通的应用通过特定的URL也可以对用户进行深度链接,使用的是 URI Scheme。 这意味着,您只需将 af_dp 参数添加到 AppsFlyer 通用的追踪链接中,即可在 Android 应用中使用深度链接。
社交网络应用中是否对深度链接有限制?
很遗憾,有。
社交应用以不同的方式处理来自病毒式传播的帖子中的深度链接,这往往会影响用户的体验。 AppsFlyer 建议的变通办法是使用 OneLink 将用户从病毒式传播的帖子中重定向至着陆页。 着陆页也会包含 OneLink,因此可以顺畅地传送转化数据,而不会影响用户的体验。
如需获取更多详细信息,请参阅 OneLink 基础设置指南。
是否可以给 af_dp 添加参数?
可以,但不建议这么做。
af_dp 可以包含 URI 值,任何参数都可以作为 URI 路径的一部分进行传送,例如:af_dp=greatapp%3A%2F%2Fparam1%2Fparam2 (greatapp://param1/param2)。
还有更简单的方法,您可以在追踪链接的 '?' 符号后添加任何参数。
但是,不建议在 af_dp 值的 '?' 符号后面连接参数。 通过转化数据或其他 API,这些参数可能会被舍弃而失效。
反面例子:af_dp=greatapp%3A%2F%2F%3Fparam1%3Da%26param2%3Db (greatapp://?param1=a¶m2=b)。
故障排除
iOS 应用能够启动但不调用 onAppOpenAttribution 回调函数
这表示深度链接的 SDK 对接没有全部完成。 AppDelegate 上缺失 continueUserActivity
方法,应添加对该方法的调用。
iOS 应用能够启动,但立即重定向至应用商店
这通常是 https 链接启动应用时,应用中用于重定向至浏览器的代码所致。
iOS - 点击链接始终重定向至应用商店
在 iOS 9 和 10 中( iOS 11 中已经删除),有一个选项可以忽略深度链接。 当应用被通用链接打开时,iOS 会在设备的右上角显示一个按钮,将该链接设置为无深度链接打开。
要重置此设置,在 iOS 设备上长按链接,直到出现以下弹出菜单:
选择在应用中打开(例如,在 LoginBox 中打开)。
然后即可恢复深度链接。
我长按链接后没有看到“在应用中打开”选项!
-
iOS 应用中含有 Provisioning 文件(类似于一个许可)。 该文件是在 Apple 开发者控制台中生成,应针对通用链接启用该文件。
- 确保应用的 Team ID 与 OneLink 配置页面中输入的信息相匹配。
iOS 通用链接 - 打开的是 Safari 而不是应用
删除应用,重新安装,然后重新运行。 如果问题仍然存在,尝试在“关联域”中添加一行(这样它就发生了变化)。 然后,删除应用并重复上述流程。 同样需确保您的 OneLink 与应用中设置的域完全一样。
iOS 通用链接 - 我试过了,但仍然有问题。 请求帮助!
收到! 如果上述方法仍无法解决问题,尝试重新生成应用的 Provisioning 文件。重新下载该文件并在 Xcode 上安装。
您也可以尝试删除应用并重新安装更新的版本。
iOS 通用链接 - iOS 11.2版本的问题
iOS 11.2,包括之后的iOS 11.2.5版本,有时候会由于bug阻止来自通用链接的深度链接。
通常下载任何iOS应用时,都会自动下载apple-app-site-association文件,该文件通过通用链接打开应用,但有时候iOS 11.2及以上版本的设备会无法下载该文件,当设备上没有这个文件的时候,会造成通用链接无法直接打开应用。
如果当你在测试深度链接时遇到了这个问题,删除应用,重启设备(已加白名单),然后重新安装。仍不行?再试一次。
目前仍不清楚这个问题影响范围有多大,但在版本是iOS 11.2的苹果设备上已多次发生。希望苹果可以尽快修复这个问题,这个问题会影响对三分之二以上的iOS用户进行深度链接。