延迟深度链接让未安装您应用的用户可以点击 Adjust 链接,从 App Store 安装应用,并在首次打开应用时直接跳转至其目标内容。
工作原理
以下是延迟深度链接的基本流程:
- 用户点击 Adjust 深度链接。
- Adjust 服务器将用户重定向至 App Store。
- 用户安装并打开您的应用。
- Adjust 服务器进行归因,并将深度链接发送至 Adjust SDK。
- 如果适用,您的应用将显示其初始界面,例如新客户引导界面和用户登录界面。
- Adjust SDK 会向您的应用发送延迟深度链接。您的应用程序随后会处理此链接,将用户引导至相应的界面。(此步骤的具体机制取决于您的设置,如下所述。)
当用户点击 Adjust 品牌化链接 (brandname.go.link),且该链接被延迟时,Adjust 的服务器会使用在 Adjust 控制面板的 iOS 平台设置中配置的应用 Scheme,将其转换为应用 Scheme 格式 (example://),然后传递给 Adjust SDK。
因此,您应设置应用以相同方式处理 Adjust 品牌化链接和应用 Scheme 深度链接。例如,以下两个链接都应打开同一个界面:
- Adjust 品牌化链接: https://brandname.go.link/summer-clothes?promo=beach
- 应用 Scheme 深度链接: example://summer-clothes?promo=beach
您的应用需要通过解析延迟深度链接的组件 (例如:路径、查询参数) 来加以处理,并跳转至相应的界面。
设置
设置延迟深度链接回传
- 遵循 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 {
   // (for example, store deep link or handle it immediately)
   return false // or true based on your use case (see below)
   - (BOOL)adjustDeferredDeeplinkReceived:(NSURL *)deeplink {
      // (for example, store deep link 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 深度链接后,会跳转至 App Store。 
- 
用户安装并打开应用。 
- 
Adjust SDK 向 Adjust 的服务器发送会话和归因请求。 
- 
应用开始其新客户引导流程。 
- 
Adjust 的服务器会返回包含归因数据的响应,其中包括用户点击的深度链接 (“延迟深度链接”)。 
- 
Adjust SDK 在应用中触发延迟深度链接回传 (如下面的 AppDelegate 中所示)。相关回传检查是否已完成新用户引导: 
- 如果已完成新客户引导,会立即处理深度链接。
- 如果未完成新客户引导,则会存储深度链接。
 
- 
完成新客户引导后,应用会检查并处理任何已存储的延迟深度链接 (如以下 ViewController 和 ContentView 示例所示)。 
- 
应用将用户引导至深度链接界面。 
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
      // TODO: Handle the deferred deep link by parsing its components
      // (example: path, query parameters) and
      // navigating 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
    // TODO: Handle the deferred deep link by parsing its components
    // (example: path, query parameters) and
    // navigating 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")
      // TODO: Handle deferredLink by parsing its components
      // (example: path, query parameters) and
      // navigating 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"];
    // TODO: Handle deferredLink by parsing its components
    // (example: path, query parameters) and
    // navigating 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")
            // TODO: Handle deferredLink by parsing its components
            // (example: path, query parameters) and
            // navigating to the appropriate screen.