遅延ディープリンクを使用すると、アプリをインストールしていないユーザーがAdjustのリンクをクリックしてApp Storeからアプリをインストールし、アプリを初回起動した際に目的のコンテンツに誘導することができます。
仕組み
以下は、ディファードディープリンクの基本的なフローです。
- ユーザーがAdjustディープリンクをクリックします。
 
- AdjustサーバーがユーザーをApp Storeにリダイレクトします。
 
- ユーザーがアプリをインストールして開きます。
 
- Adjustサーバーがアトリビューションを実行し、ディープリンクがAdjust SDKに送られます。
 
- 該当する場合、アプリにはオンボーディング画面やユーザーログインなどの初期画面が表示されます。
 
- Adjust SDKがディファードディープリンクをアプリに提供します。その後、アプリがこのリンクを処理して、ユーザーを適切な画面に誘導します(このステップの具体的な実装方法は、以下で説明するように、ご利用のセットアップによって異なります)。
 
ユーザーがAdjustのブランドリンク (brandname.go.link)をクリックし、そのリンクがディファードリンクである場合、Adjustのサーバーはそれをアプリスキーム形式(example://)に変換し、AdjustダッシュボードのiOSプラットフォーム設定で構成されたアプリスキームを使用して、SDKに渡す前に処理を行います。
そのため、Adjustのブランドリンクとアプリスキームのディープリンクを同じ方法で処理できるようにアプリを設定する必要があります。例えば、以下のリンクは両方とも同じ画面を開く必要があります。
- Adjustブランドリンク: 
https://brandname.go.link/summer-clothes?promo=beach 
- アプリスキームのディープリンク: 
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.appDidLaunch(adjustConfig)
     ADJConfig *adjustConfig = [[ADJConfig alloc] initWithAppToken:@"{YourAppToken}"
                                            environment:ADJEnvironmentSandbox];
[adjustConfig setDelegate:self];
[Adjust appDidLaunch:adjustConfig];
         
adjustDeeplinkResponseコールバックメソッドをアプリデリゲートに追加します。Adjust SDKは、ディファードディープリンクを受け取った後にこのメソッドを呼び出します。 
   func adjustDeeplinkResponse(_ deeplink: URL?) -> Bool {
   // (for example, store deep link or handle it immediately)
   return false // or true based on your use case (see below)
     - (BOOL)adjustDeeplinkResponse:(NSURL *)deeplink {
      // (for example, store deep link or handle it immediately)
      return NO; // or YES based on your use case (see below)
         
戻り値のオプション
adjustDeeplinkResponseの戻り値によって、コールバックコードが実行された後に何が起こるかが決定します。
falseを返す(最も一般的)
アプリがいつ、どのようにディファードディープリンクを処理するかを完全に制御したい場合は、このアプローチを使用してください。falseを返すと、Adjust SDKはディファードディープリンクを開きません。例えば、アプリがディファードディープリンクを処理する前に初期画面(オンボーディングやログインなど)を表示してから移動する必要がある場合は、このアプローチが適切です。
戻り値 true
コールバックコードが実行された直後にAdjust SDKがディファードディープリンクを開くようにしたい場合は、このアプローチを使用してください。例えば、アプリに初期画面がない場合は、このアプローチが適切です。
Adjust SDKがディファードディープリンクを受け取ると、コールバックコードが実行され、Adjust SDKはapplication(_:open:options:)をディファードディープリンクで呼び出します。iOSはアプリ設定に基づいて適切なハンドラーにルーティングします
| アプリの実装 | ハンドラー | 
|---|
| AppDelegateを使用したUIKit | application(_:open:options:) | 
| sceneDelegateを使用したUIKit | scene(_:openURLContexts:) | 
| SwiftUI | .onOpenURL modifier | 
上記の適切なハンドラーからディープリンクを処理するには、ダイレクトディープリンクをすでに実装していることを確認してください。
完全なコード例
この例では、アプリがディファードディープリンクを処理できるようになる前に、オンボーディングプロセスを完了する必要があるケースを示しています。以下は、サンプルコードの動作概要です。
- 
アプリをインストールしていないユーザーがAdjustディープリンクをクリックすると、ユーザーはアプリストアにリダイレクトされます。
 
- 
ユーザーがアプリをインストールして開きます。
 
- 
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.appDidLaunch(adjustConfig)
  // Receive deferred deep link via AdjustDelegate method
  func adjustDeeplinkResponse(_ 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 appDidLaunch:adjustConfig];
// Receive deferred deep link via AdjustDelegate method
- (BOOL)adjustDeeplinkResponse:(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.