遅延ディープリンクを使用すると、アプリをインストールしていないユーザーがAdjustのリンクをクリックしてApp Storeからアプリをインストールし、アプリを初回起動した際に目的のコンテンツに誘導することができます。
仕組み
以下は、ディファードディープリンクの基本的なフローです。
- ユーザーがAdjustディープリンクをクリックします。
- AdjustサーバーがユーザーをApp Storeにリダイレクトします。
- ユーザーがアプリをインストールして開きます。
- Adjustサーバーがアトリビューションを実行し、ディープリンクがAdjust SDKに送られます。
- 該当する場合、アプリにはオンボーディング画面やユーザーログインなどの初期画面が表示されます。
- Adjust SDKがディファードディープリンクをアプリに提供します。その後、アプリがこのリンクを処理して、ユーザーを適切な画面に誘導します(このステップの具体的な実装方法は、以下で説明するように、ご利用のセットアップによって異なります)。
ユーザーがAdjustのブランドリンク (brandname.go.link
)をクリックし、リンクがディファードされると、Adjustのサーバーは、AdjustダッシュボードのiOSプラットフォーム設定で設定されたアプリスキームを使用して、リンクをアプリスキーム形式 (example://
) に変換した後、パスします。 Adjust 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.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 SDKがそのディファードディープリンクを使って application(_:open:options:)
を呼び出します。iOSはアプリの設定に基づいて、それを適切なハンドラーへルーティングします。
アプリの実装 | ハンドラー |
---|
AppDelegateを使用したUIKit | application(_:open:options:) |
SceneDelegateを使用したUIKit | scene(_:openURLContexts:) |
SwiftUI | .onOpenURLmodifier |
上記の適切なハンドラーからディープリンクを処理するには、ダイレクトディープリンクをすでに実装していることを確認してください。
完全なコード例
この例では、アプリでディファードディープリンクを操作する前に完了させなければならないオンボーディングプロセスがあります。サンプルコードの仕組みを以下に示します。
-
アプリをインストールしていないユーザーが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.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.