延迟深度链接让未安装您应用的用户可以点击 Adjust 链接,从应用商店安装应用,并在首次打开应用时直接跳转至其目标内容。
工作原理
以下是延迟深度链接的基本流程:
-
用户点击 Adjust 深度链接。
-
Adjust 服务器将用户重定向至应用商店。
-
用户安装或重装并打开应用。
-
Adjust SDK 向 Adjust 服务器发送 /session 和 /attribution 请求。
-
Adjust 服务器将匹配点击与安装/重装,并通过下列任一响应将延迟深度链接返回至 SDK:
/session 响应 (优化延迟深度链接)
/attribution 响应 (遗留行为)
Adjust SDK 会通过延迟深度链接回传,向您的应用发送延迟深度链接。
-
如果适用,您的应用将显示其初始界面,例如新客户引导界面和用户登录界面。
-
您的应用处理深度链接,并导航至相应界面。
当用户点击 Adjust 品牌化链接 (brandname.go.link),且该链接被延迟时,Adjust 的服务器会使用在 Adjust 控制面板的 iOS 平台设置中配置的应用 Scheme,将其转换为应用 Scheme 格式 (example://),然后传递给 Adjust SDK。
设置
设置延迟深度链接回传
- 遵循 AppDelegate 中的 AdjustDelegate 协议。如果您已经配置归因回传,可以跳过这一步。
class AppDelegate: UIResponder, UIApplicationDelegate, AdjustDelegate {
@interface AppDelegate : UIResponder <UIApplicationDelegate, AdjustDelegate>
- 在初始化 SDK 之前,在 Adjust 配置中将 AppDelegate 指定为委托。
let yourAppToken = "{YourAppToken}"
let environment = ADJEnvironmentSandbox
let adjustConfig = ADJConfig(
environment: environment)
adjustConfig?.delegate = self
Adjust.initSdk(adjustConfig)
ADJConfig *adjustConfig = [[ADJConfig alloc] initWithAppToken:@"{YourAppToken}"
environment:ADJEnvironmentSandbox];
[adjustConfig setDelegate:self];
[Adjust initSdk:adjustConfig];
- 向应用委托添加
adjustDeferredDeeplinkReceived 回传方法。Adjust SDK 收到延迟深度链接后会调用该方法。
func adjustDeferredDeeplinkReceived(_ deeplink: URL?) -> Bool {
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link
// (for example, store it or handle it immediately)
return false // or true based on your use case (see below)
- (BOOL)adjustDeferredDeeplinkReceived:(NSURL *)deeplink {
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link
// (for example, store it or handle it immediately)
return NO; // or YES based on your use case (see below)
返回值选项
adjustDeferredDeeplinkReceived 的返回值决定了回传代码执行完毕后将执行什么操作:
返回 false (最常见)
如果希望您的应用对延迟深链接的处理时间和方式拥有完全控制权,请采用此方法。返回 false 时,Adjust SDK 不会尝试打开延迟深度链接。例如,如果您的应用需要在处理延迟深度链接之前显示并跳过初始界面 (如新客户引导或登录界面),则此方法十分适用。
返回 true
如果您希望 Adjust SDK 在回传代码运行完毕后立即尝试打开延迟深度链接,请使用此方法。例如,如果您的应用没有任何初始界面,则此方法十分适用。
当 Adjust SDK 收到延迟深度链接时,将运行 Adjust 回传代码,然后 Adjust SDK 会使用该链接调用 application(_:open:options:),iOS 随后根据您的应用设置将其路由到相应的处理程序:
| 应用实施 | 处理程序 |
|---|
| 使用 AppDelegate 的 UIKit | application(_:open:options:) |
| 使用 SceneDelegate 的 UIKit | scene(_:openURLContexts:) |
| SwiftUI | .onOpenURL 修饰符 |
如需处理来自上述相应处理程序的深度链接,请确保您已实施直接深度链接。
完整代码示例
此示例展示了拥有新客户引导流程的应用如何处理延迟深度链接。应用内部流程总结如下:
-
用户打开应用,延迟深度链接进入可用状态。
-
应用开始其新客户引导流程。
-
应用的回传从 Adjust SDK 接收延迟深度链接,然后检查新客户引导是否完成:
- 如果已完成新客户引导,会立即处理深度链接。
- 如果未完成新客户引导,则会存储深度链接。
-
新客户引导完成后,应用会检查并处理所有已存储的延迟深度链接。
-
应用将用户引导至深度链接界面。
AppDelegate
突出显示的代码中包含 AppDelegate 的延迟深度链接更新。此示例适用于 UIKit 和 SwiftUI 示例。
class AppDelegate: UIResponder, UIApplicationDelegate, AdjustDelegate {
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
// Replace {YourAppToken} with your Adjust app token
let appToken = "{YourAppToken}"
var adjustConfig: ADJConfig?
// Enable verbose logging for deep link testing
let environment = ADJEnvironmentSandbox
adjustConfig = ADJConfig(appToken: appToken, environment: environment)
adjustConfig?.logLevel = ADJLogLevel.verbose
let environment = ADJEnvironmentProduction
adjustConfig = ADJConfig(
appToken: appToken, environment: environment, suppressLogLevel: true)
adjustConfig?.logLevel = ADJLogLevel.suppress
// Create delegate for deferred deep linking
adjustConfig?.delegate = self
Adjust.initSdk(adjustConfig)
// Receive deferred deep link via AdjustDelegate method
func adjustDeferredDeeplinkReceived(_ deeplink: URL?) -> Bool {
// Handle failure if deeplink is nil
guard let deeplink = deeplink else { return false }
if UserDefaults.standard.bool(forKey: "hasCompletedOnboarding") {
// If onboarding is complete, handle deferred deep link immediately
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
UserDefaults.standard.set(
deeplink.absoluteString, forKey: "deferredLink")
// The app controls when and how it handles the deferred deep link, so return false.
#import <AdjustSdk/AdjustSdk.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Replace {YourAppToken} with your Adjust app token
NSString *appToken = @"{YourAppToken}";
// Enable verbose logging for deep linking testing
adjustConfig = [ADJConfig configWithAppToken:appToken
environment:ADJEnvironmentSandbox];
[adjustConfig setLogLevel:ADJLogLevelVerbose];
adjustConfig = [ADJConfig configWithAppToken:appToken
environment:ADJEnvironmentProduction
allowSuppressLogLevel:YES];
[adjustConfig setLogLevel:ADJLogLevelSuppress];
// Create delegate for deferred deep linking
adjustConfig.delegate = self;
[Adjust initSdk:adjustConfig];
// Receive deferred deep link via AdjustDelegate method
- (BOOL)adjustDeferredDeeplinkReceived:(nullable NSURL *)deeplink {
// Handle failure if deeplink is nil
if (!deeplink) return NO;
if ([[NSUserDefaults standardUserDefaults]
boolForKey:@"hasCompletedOnboarding"]) {
// If onboarding is complete, handle deferred deep link immediately
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link and navigate to the appropriate screen.
// Store deferred deep link to invoke after onboarding screens and login
[[NSUserDefaults standardUserDefaults] setObject:deeplink.absoluteString
// The app controls when and how it handles the deferred deep link, so return NO.
@interface AppDelegate : UIResponder <UIApplicationDelegate, AdjustDelegate>
UIKit
class ViewController: UIViewController {
var hasCompletedOnboarding: Bool {
UserDefaults.standard.bool(forKey: "hasCompletedOnboarding")
UserDefaults.standard.set(newValue, forKey: "hasCompletedOnboarding")
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Check if onboarding has been completed
if hasCompletedOnboarding {
// Show onboarding screens and login prompt
// After onboarding, set hasCompletedOnboarding to true
hasCompletedOnboarding = true
// Check for deferredLink received before or during onboarding
if let deferredLink = UserDefaults.standard.string(forKey: "deferredLink") {
// Remove stored deferred deep link to avoid handling again later
UserDefaults.standard.removeObject(forKey: "deferredLink")
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link and navigate to the appropriate screen.
#import <AdjustSdk/AdjustSdk.h>
#import "ViewController.h"
@implementation ViewController
- (BOOL)hasCompletedOnboarding {
return [[NSUserDefaults standardUserDefaults]
boolForKey:@"hasCompletedOnboarding"];
- (void)setHasCompletedOnboarding:(BOOL)hasCompletedOnboarding {
[[NSUserDefaults standardUserDefaults] setBool:hasCompletedOnboarding
forKey:@"hasCompletedOnboarding"];
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Check if onboarding has been completed
if (self.hasCompletedOnboarding) {
// Show onboarding screens and login prompt
// After onboarding, set hasCompletedOnboarding to YES
self.hasCompletedOnboarding = YES;
// Check for deferred deep link received before or during onboarding
[[NSUserDefaults standardUserDefaults] stringForKey:@"deferredLink"];
// Remove stored deferred deep link to avoid handling again later
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"deferredLink"];
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link and navigate to the appropriate screen.
SwiftUI
struct ContentView: View {
// Check if onboarding has been completed
if !UserDefaults.standard.bool(forKey: "hasCompletedOnboarding") {
// Show onboarding screens and login prompt
// After onboarding, set hasCompletedOnboarding to true
UserDefaults.standard.set(true, forKey: "hasCompletedOnboarding")
// Check for deep link received before or during onboarding
if let deferredLink = UserDefaults.standard.string(
// Remove stored deferred deep link to avoid handling again later
UserDefaults.standard.removeObject(forKey: "deferredLink")
// example://summer-clothes?promo=beach&adj_t=def456
// TODO: Handle the deep link and navigate to the appropriate screen.