디퍼드 딥링킹을 사용하면 앱을 설치하지 않은 사용자가 Adjust 링크를 클릭하여 앱 스토어에서 앱을 설치한 후, 처음 앱을 열 때 원하는 콘텐츠로 이동할 수 있습니다.
작동 방식
다음은 디퍼드 딥링킹의 기본 흐름입니다.
사용자가 Adjust 딥링크를 클릭합니다.
Adjust 서버가 사용자를 앱 스토어로 리다이렉트합니다.
사용자가 앱을 설치 또는 재설치하고, 실행합니다.
Adjust SDK가 /session 요청과 /attribution 요청을 Adjust 서버로 전송합니다.
Adjust 서버가 클릭을 설치 또는 재설치와 매칭하고, 다음 응답 중 하나에서 디퍼드 딥링크를 SDK에 반환합니다.
Adjust SDK는 디퍼드 딥링크 콜백을 통해 디퍼드 딥링크를 앱에 전달합니다.
해당되는 경우, 앱은 온보딩 화면과 사용자 로그인 화면 같은 초기 화면을 표시합니다.
앱이 딥링크를 처리하여 적절한 화면으로 이동합니다.
사용자가 Adjust 브랜드 링크(brandname.go.link)를 클릭하고 링크가 디퍼드되면 Adjust 서버는 Adjust 대시보드의 iOS 플랫폼 설정에서 구성된 APP SCHEME을 사용하여 해당 링크를 APP 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 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.