에어브릿지로 이동합니다.
에어브릿지 대시보드에서 [새로운 앱 등록]을 클릭해 앱을 등록합니다.
앱을 등록한 후에 해당 앱의 에어브릿지 대시보드 [트래킹링크]>[딥링크]에서 딥링크 정보를 등록합니다.
안드로이드 URI 스킴
딥링크에 사용할 스킴을 입력해주세요. 에어브릿지는 입력한 스킴을 사용하는 딥링크만 트래킹링크에 설정할 수 있고, 트래킹링크로 앱이 열릴 때 설정한 딥링크가 전달됩니다. 예: scheme://
안드로이드 패키지 이름
앱의 패키지이름을 입력해주세요. 예: com.example.application
sha256_cert_fingerprints
앱에 서명하는 KeyStore
파일의 SHA256 해쉬값을 입력해주세요. 예: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99
해쉬값을 찾는 방법은 아래를 참고해주세요.
# Command
keytool -list -v -keystore YOUR_KEYSTORE.keystore
# Result
Certificate fingerprints:
MD5: 4C:65:04:52:F0:3F:F8:65:08:D3:71:86:FC:EF:C3:49
SHA1: C8:BF:B7:B8:94:EA:5D:9D:38:59:FE:99:63:ED:47:B2:D9:5A:4E:CC
SHA256: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99
iOS URI 스킴
딥링크에 사용할 스킴을 입력해주세요. 에어브릿지는 입력한 스킴을 사용하는 딥링크만 트래킹링크에 설정할 수 있고, 트래킹링크로 앱이 열릴 때 설정한 딥링크가 전달됩니다. 예: scheme://
iOS 앱 ID
애플 개발자 대시보드의 앱의 [Identifier]에서 App ID Prefix
, Bundle ID
값을 가져와서 App ID Prefix
+ . + Bundle ID
형식으로 입력해주세요. 예: 9JA89QQLNQ.com.apple.wwdc
앱에 에어브릿지 SDK를 설치하고 필수 설정을 완료하세요.
에어브릿지 안드로이드 SDK를 설치합니다. SDK를 설치할 프로젝트의 build.gradle
또는 settings.gradle
중 repositories
블락이 있는 파일에 SDK 저장소를 선언하세요. 그리고 어플리케이션의 build.gradle
파일에서 SDK 패키지를 추가하세요.
아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION
에 입력하세요.
SDK 버전 목록: 링크
프로젝트 build.gradle
또는 settings.gradle
파일
allprojects {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
allprojects {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
dependencyResolutionManagement {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
dependencyResolutionManagement {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
어플리케이션 build.gradle
파일
dependencies {
// Replace $HERE_LATEST_VERSION with latest version
// - Versions: https://sdk-download.airbridge.io/maven
// - Example: implementation "io.airbridge:sdk-android:0.0.0"
implementation "io.airbridge:sdk-android:$HERE_LATEST_VERSION"
}
dependencies {
// Replace $HERE_LATEST_VERSION with latest version
// - Versions: https://sdk-download.airbridge.io/maven
// - Example: implementation "io.airbridge:sdk-android:0.0.0"
implementation("io.airbridge:sdk-android:$HERE_LATEST_VERSION")
}
MainApplication
클래스를 생성하고 AndroidManifest.xml
에 추가하세요. 그리고 클래스의 onCreate
함수에서 SDK를 초기화하세요.
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
<application
android:name=".MainApplication"
...>
import android.app.Application
import co.ab180.airbridge.Airbridge
class MainApplication: Application() {
override fun onCreate() {
super.onCreate()
// YOUR_APP_NAME: Input your app name
// YOUR_APP_SDK_TOKEN: Input your app token
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(this, option)
}
}
import android.app.Application;
import co.ab180.airbridge.Airbridge;
public class MainApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// YOUR_APP_NAME: Input your app name
// YOUR_APP_SDK_TOKEN: Input your app token
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build();
Airbridge.initializeSDK(this, option);
}
}
AndroidManifest.xml
파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.
<manifest>
태그의 xmlns:tools
에 내용을 추가해주세요.
<application>
태그에 android:allowBackup
이 있으면 tools:replace
에 값을 추가해주세요.
<application>
태그에 android:dataExtractionRules
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<application>
태그에 android:fullBackupContent
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...>
<application
android:allowBackup="..."
android:dataExtractionRules="..."
android:fullBackupContent="..."
tools:replace="android:allowBackup,android:dataExtractionRules,android:fullBackupContent"
...>
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</device-transfer>
</data-extraction-rules>
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</full-backup-content>
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
딥링크를 처리하는 Activity 클래스를 생성하고 AndroidManifest.xml
에 추가하세요. 그리고 세가지 형태의 에어브릿지 딥링크를 Intent Filter
에 추가하세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.
YOUR_SCHEME
은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 ://
없이 사용합니다. YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
<application ...>
...
<activity android:name=".DeeplinkActivity" ...>
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_SCHEME: Input your Android URI Scheme -->
<data android:scheme="YOUR_SCHEME" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
...
</activity>
...
</application>
딥링크를 처리하는 Activity
클래스의 onResume
함수에서 handleDeeplink
함수를 호출해 트래킹 링크에 설정된 딥링크를 획득할 수 있습니다. 그리고 유저가 앱 화면으로 이동할 수 있도록 설정하세요.
앱이 에어브릿지 딥링크로 실행되면handleDeeplink
의 리턴값은 true
가 전달되고, 콜백 함수의 파라미터로 트래킹 링크에 설정된 딥링크가 전달됩니다.
앱이 다른 플랫폼의 딥링크로 실행되면 handleDeeplink
의 리턴값은 false
가 전달되고, 콜백 함수는 호출되지 않습니다.
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import co.ab180.airbridge.Airbridge
class DeeplinkActivity: AppCompatActivity() {
override fun onResume() {
super.onResume()
val isAirbridgeDeeplink = Airbridge.handleDeeplink(intent) { uri ->
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
if (isAirbridgeDeeplink) return
// when app is opened with other deeplink
// use existing logic as it is
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
}
}
import android.content.Intent;
import androidx.appcompat.app.AppCompatActivity;
import co.ab180.airbridge.Airbridge;
public class DeeplinkActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
boolean isAirbridgeDeeplink = Airbridge.handleDeeplink(getIntent(), uri -> {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
});
if (isAirbridgeDeeplink) return;
// when app is opened with other deeplink
// use existing logic as it is
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
}
앱을 설치하지 않은 유저가 트래킹 링크를 클릭하면 앱 스토어로 랜딩시켜 앱 설치를 유도할 수 있습니다. 해당 유저가 앱을 설치 후 실행 시, 특정 앱 화면으로 이동시키고 싶은 시점에 handleDeferredDeeplink
함수를 호출하면 트래킹 링크에 설정된 딥링크를 획득할 수 있습니다. 그리고 유저가 앱 화면으로 이동할 수 있도록 설정하세요.
앱을 설치 이후 handleDeferredDeeplink
함수가 처음으로 호출되면 handleDeferredDeeplink
의 리턴값은 true
가 전달 되고, 콜백 함수의 파라미터로 트래킹 링크에 설정된 딥링크가 전달됩니다.
앱을 설치하고 handleDeferredDeeplink
함수가 처음 호출 된 것이 아니라면 handleDeferredDeeplink
의 리턴값은 false
가 전달되고, 콜백 함수은 호출되지 않습니다.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import co.ab180.airbridge.Airbridge
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val isFirstCalled = Airbridge.handleDeferredDeeplink { uri ->
// when handleDeferredDeeplink is called firstly after install
if (uri != null) {
// show proper content using uri (YOUR_SCHEME://...)
}
}
if (isFirstCalled) return
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
}
}
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import co.ab180.airbridge.Airbridge;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean isFirstCalled = Airbridge.handleDeferredDeeplink(uri -> {
// when app is opened with airbridge deeplink
if (uri != null) {
// show proper content using uri (YOUR_SCHEME://...)
}
});
if (isFirstCalled) return;
// when app is opened with other deeplink
// use existing logic as it is
}
}
에어브릿지 iOS SDK를 설치합니다.
1. Xcode에서 [File]에서 [Add Packages...]를 클릭해 주세요.
2. 검색창에 아래 주소를 입력하고 [Add Package]를 클릭합니다.
3. [Add Package]를 계속해서 클릭합니다.
4. Xcode의 [Package Dependencies]에서 에어브릿지 iOS SDK 추가를 확인할 수 있습니다.
5. SDK의 의존성에 해당하는 Framework를 프로젝트에 추가합니다. [Xcode]>[프로젝트 파일]>[General]>[Frameworks, Libraries, and Embedded Content]에서 ‘+’를 클릭합니다.
6. 아래 Framework를 모두 추가합니다. 추가한 Framework의 Embed를 Do not Embed로 설정합니다. 그리고 [Xcode]>[프로젝트 파일]>[Build Phase]>[Link Binary With Libraries]에서 Status를 Optional로 설정합니다.
Framework | 설명 |
---|---|
AdSupport.framework | IDFA를 수집하는데 사용합니다. |
CoreTelephony.framework | 통신사 정보를 수집하는데 사용합니다. |
StoreKit.framework | SKAdNetwork 정보를 수집하는데 사용합니다. |
AppTrackingTransparency.framework | 추적 허용 상태정보를 수집하는데 사용합니다. |
AdServices.framework | Apple Ads의 어트리뷰션 정보를 수집하는데 사용합니다. (iOS 14.3+) |
WebKit.framework | Web SDK와 연동하여 이벤트를 수집하는데 사용합니다. |
주의하세요
[Xcode]>[YOUR_PROJECT]>[Build Settings]>[User Script Sandboxing]을 No로 설정한 후에 iOS SDK를 설치해야 합니다. 자세한 내용은 CocoaPods 문서를 참고해 주세요.
1. brew install cocoapods
로 CocoaPods를 설치합니다.
2. pod init
로 Podfile을 생성합니다.
3. Podfile에 아래 코드로 SDK를 의존성으로 추가합니다. 그리고 아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION
에 입력하세요.
SDK 버전 목록: 링크
target '[Project Name]' do
...
# Replace $HERE_LATEST_VERSION with latest version
# - Versions: https://help.airbridge.io/developers/release-note-ios-sdk
# - Example: pod 'airbridge-ios-sdk', '4.X.X'
pod 'airbridge-ios-sdk', '$HERE_LATEST_VERSION'
...
end
4. pod install --repo-update
를 입력하면 설치가 진행됩니다
5. YOUR_PROJECT.xcworkspace
를 실행하면 에어브릿지 iOS SDK가 정상적으로 설치된 것을 확인할 수 있습니다.
주의하세요
Tuist의 Tuist's XcodeProj-based integration 방식으로는 에어브릿지 iOS SDK를 설치할 수 없습니다. 반드시 Xcode's default integration 방식으로 설치해 주세요.
1. tuist edit
명령어를 실행합니다.
2. project.packages
에 remote
를 추가합니다. project.targets[...].target.dependencies
에 package
를 추가합니다. 그리고 아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION
에 입력하세요.
SDK 버전 목록: 링크
import ProjectDescription
let project = Project(
packages: [
.remote(
url: "https://github.com/ab180/airbridge-ios-sdk-deployment",
// Replace $HERE_LATEST_VERSION with latest version
// - Versions: https://help.airbridge.io/developers/release-note-ios-sdk
// - Example: requirement: .exact(from: "4.X.X")
requirement: .exact(from: "$HERE_LATEST_VERSION")
),
...
],
targets: [
.target(
dependencies: [
.package(product: "Airbridge", type: .runtime),
.sdk(name: "AdSupport", type: .framework, status: .optional),
.sdk(name: "AdServices", type: .framework, status: .optional),
.sdk(name: "CoreTelephony", type: .framework, status: .optional),
.sdk(name: "StoreKit", type: .framework, status: .optional),
.sdk(name: "AppTrackingTransparency", type: .framework, status: .optional),
.sdk(name: "WebKit", type: .framework, status: .optional),
...
]
),
...
],
...
)
3. tuist generate
명령어를 실행합니다.
4. Xcode의 Package Dependencies에 Airbridge가 추가됩니다.
1. 아래 링크에서 에어브릿지 iOS SDK를 다운로드합니다.
2. Airbridge.xcframework를 프로젝트에 추가합니다. [Xcode]>[프로젝트 파일]>[General]>[Frameworks, Libraries, and Embedded Content]에서 ‘+’를 클릭합니다.
3. [Add Other...]에서 ‘Add Files...’를 클릭하고 Airbridge.xcframework를 선택합니다.
4. Airbridge.xcframework의 Embed를 Embed & Sign로 설정합니다.
5. SDK의 의존성에 해당하는 Framework를 프로젝트에 추가합니다. [Xcode]>[프로젝트 파일]>[General]>[Frameworks, Libraries, and Embedded Content]에서 ‘+’를 클릭합니다.
6. 아래 Framework를 모두 추가합니다. 추가한 Framework의 Embed를 Do not Embed로 설정합니다. 그리고 [Xcode]>[프로젝트 파일]>[Build Phase]>[Link Binary With Libraries]에서 Status를 Optional로 설정합니다.
Framework | 설명 |
---|---|
AdSupport.framework | IDFA를 수집하는데 사용합니다. |
CoreTelephony.framework | 통신사 정보를 수집하는데 사용합니다. |
StoreKit.framework | SKAdNetwork 정보를 수집하는데 사용합니다. |
AppTrackingTransparency.framework | 추적 허용 상태정보를 수집하는데 사용합니다. |
AdServices.framework | Apple Ads의 어트리뷰션 정보를 수집하는데 사용합니다. (iOS 14.3+) |
WebKit.framework | Web SDK와 연동하여 이벤트를 수집하는데 사용합니다. |
다음을 참고하여 SDK를 초기화하세요.
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
return true
}
}
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
return true
}
}
import SwiftUI
import Airbridge
@main
struct ExampleApp: App {
init() {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
}
}
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
return YES;
}
@end
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
return YES;
}
@end
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
SDK는 유저가 ATT 프롬프트에서 동의 여부를 결정할 때까지 설치 이벤트를 수집하지 않고 디퍼드 딥링크도 작동하지 않습니다.
setAutoDetermineTrackingAuthorizationTimeout
함수를 통해 ATT 프롬프트에서 동의 여부에 대한 타임아웃을 설정 할 수 있습니다. ATT 프롬프트에서 동의 여부를 받지 않고 타임아웃 발생 시 설치 이벤트를 수집 및 디퍼드 딥링크가 ATT 프롬프트에서 동의 여부와 관계 없이 작동 됩니다. 기본값은 30초입니다.
딥링크 플랜은 식별자를 활용한 어트리뷰션을 지원하지 않습니다. 따라서 디퍼드 딥링크에서 설정된 목적지로 앱을 설치한 유저를 지연 없이 보내기 위해서 setAutoDetermineTrackingAuthorizationTimeout
함수를 0초로 설정하세요.
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME",
token: "YOUR_APP_SDK_TOKEN")
.setAutoDetermineTrackingAuthorizationTimeout(second: 0)
.build()
Airbridge.initializeSDK(option: option)
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
[optionBuilder setAutoDetermineTrackingAuthorizationTimeoutWithSecond:0];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
아래 설명에 따라 스킴 딥링크 앱 설정과 유니버셜 링크 앱 설정을 완료하세요.
에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.
스킴 딥링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동하고 '+'를 클릭합니다. 그리고 YOUR_SCHEME
을 입력합니다.
유니버셜 링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동하고 '+ Capability'를 클릭합니다. 그리고 Associated Domains를 선택하고 applinks:YOUR_APP_NAME.airbridge.io
와 applinks:YOUR_APP_NAME.abr.ge
를 추가합니다.
YOUR_SCHEME
은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 ://
없이 사용합니다. YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
앱이 딥링크로 열릴 때, trackDeeplink
함수를 호출해 SDK가 딥링크 이벤트를 수집하도록 설정하세요. 그리고 handleDeeplink
함수를 호출해 트래킹 링크에 설정된 딥링크를 획득할 수 있습니다. 그리고 유저가 앱 화면으로 이동할 수 있도록 설정하세요.
앱이 에어브릿지 딥링크로 실행되면 handleDeeplink
의 리턴값은 true
가 전달되고, 콜백 함수의 파라미터로 트래킹 링크에 설정된 딥링크가 전달됩니다.
앱이 다른 플랫폼의 딥링크로 실행되면 handleDeeplink
의 리턴값은 false
가 전달되고, 콜백 함수는 호출되지 않습니다.
import UIKit
import Airbridge
@main
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
// when app is opened with airbridge deeplink
func handleAirbridgeDeeplink(url: URL) {
// show proper content using url (YOUR_SCHEME://...)
}
// when terminated app is opened with scheme deeplink or universal links
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
// when app is opened with scheme deeplink
if let url = connectionOptions.urlContexts.first?.url {
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(url: url) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
}
// when app is opened with universal links
else if let userActivity = connectionOptions.userActivities.first {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(userActivity: userActivity) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
}
}
// when backgrounded app is opened with scheme deeplink
func scene(
_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>
) {
guard let url = URLContexts.first?.url else { return }
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(url: url) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
}
// when backgrounded app is opened with universal links
func scene(
_ scene: UIScene,
continue userActivity: NSUserActivity
) {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(userActivity: userActivity) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
}
}
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
// when app is opened with airbridge deeplink
func handleAirbridgeDeeplink(url: URL) {
// show proper content using url (YOUR_SCHEME://...)
}
// when app is opened with scheme deeplink
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(url: url) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
return isAirbridgeDeeplink
}
// when app is opened with universal links
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(userActivity: userActivity) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
handleAirbridgeDeeplink(url: url)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
return isAirbridgeDeeplink
}
}
import SwiftUI
import Airbridge
@main
struct ActualApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// when app is opened with scheme deeplink or universal links
.onOpenURL { url in
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle deeplink
var isAirbridgeDeeplink = Airbridge.handleDeeplink(url: url) { url in
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
if isAirbridgeDeeplink { return }
// when app is opened with other deeplink
// use existing logic as it is
}
}
}
}
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface SceneDelegate ()
@end
@implementation SceneDelegate
// when app is opened with airbridge deeplink
- (void)handleAirbridgeDeeplink:(NSURL *)url {
// show proper content using url (YOUR_SCHEME://...)
}
// when terminated app is opened with scheme deeplink or universal links
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// when app is opened with scheme deeplink
NSURL* url = connectionOptions.URLContexts.allObjects.firstObject.URL;
NSUserActivity* userActivity = connectionOptions.userActivities.allObjects.firstObject;
if (url != nil) {
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
}
else if (userActivity != nil) {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
}
}
// when backgrounded app is opened with scheme deeplink
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
NSURL* url = URLContexts.allObjects.firstObject.URL;
if (url == nil) { return; }
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
}
// when backgrounded app is opened with universal links
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
}
@end
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
// when app is opened with airbridge deeplink
- (void)handleAirbridgeDeeplink:(NSURL *)url {
// show proper content using url (YOUR_SCHEME://...)
}
// when app is opened with scheme deeplink
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
return isAirbridgeDeeplink;
}
// when app is opened with universal links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle deeplink
BOOL isAirbridgeDeeplink = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
[self handleAirbridgeDeeplink:url];
}];
if (isAirbridgeDeeplink) { return; }
// when app is opened with other deeplink
// use existing logic as it is
return isAirbridgeDeeplink;
}
@end
앱을 설치하지 않은 유저가 트래킹 링크를 클릭하면 앱 스토어로 랜딩시켜 앱 설치를 유도할 수 있습니다. 해당 유저가 앱을 설치 후 실행 시, 특정 앱 화면으로 이동시키고 싶은 시점에 handleDeferredDeeplink
함수를 호출하면 트래킹 링크에 설정된 딥링크를 획득할 수 있습니다. 그리고 유저가 앱 화면으로 이동할 수 있도록 설정하세요.
앱을 설치 이후 handleDeferredDeeplink
함수가 처음으로 호출되면 handleDeferredDeeplink
의 리턴값은 true
가 전달 되고, 콜백 함수의 파라미터로 트래킹 링크에 설정된 딥링크가 전달됩니다.
앱을 설치하고 handleDeferredDeeplink
함수가 처음 호출 된 것이 아니라면 handleDeferredDeeplink
의 리턴값은 false
가 전달되고, 콜백 함수은 호출되지 않습니다.
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
let isFirstCalled = Airbridge.handleDeferredDeeplink() { url in
// when handleDeferredDeeplink is called firstly after install
if let url {
// show `proper content using url (YOUR_SCHEME://...)
}
}
if (isFirstCalled) { return true }
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
return true
}
}
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
let isFirstCalled = Airbridge.handleDeferredDeeplink() { url in
// when handleDeferredDeeplink is called firstly after install
if let url {
// show `proper content using url (YOUR_SCHEME://...)
}
}
if (isFirstCalled) { return true }
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
return true
}
}
import SwiftUI
import Airbridge
@main
struct ExampleApp: App {
init() {
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
let isFirstCalled = Airbridge.handleDeferredDeeplink() { url in
// when handleDeferredDeeplink is called firstly after install
if let url {
// show `proper content using url (YOUR_SCHEME://...)
}
}
if (isFirstCalled) { return true }
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
}
}
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
BOOL isFirstCalled = [Airbridge handleDeferredDeeplinkOnSuccess:^(NSURL* url) {
// when handleDeferredDeeplink is called firstly after install
if let url {
// show `proper content using url (YOUR_SCHEME://...)
}
}];
if (isFirstCalled) { return YES; }
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
return YES;
}
@end
#import "AppDelegate.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
BOOL isFirstCalled = [Airbridge handleDeferredDeeplinkOnSuccess:^(NSURL* url) {
// when handleDeferredDeeplink is called firstly after install
if let url {
// show `proper content using url (YOUR_SCHEME://...)
}
}];
if (isFirstCalled) { return YES; }
// when handleDeferredDeeplink is called secondly or later after install
// use existing logic as it is
return YES;
}
@end
에어브릿지 리액트 네이티브 SDK를 설치합니다.
npm install airbridge-react-native-sdk
cd ios; pod install
앱이 열릴 때, SDK를 초기화해주세요.
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
ios/YOUR_PROJECT_NAME/AppDelegate.m
파일
import AirbridgeReactNative
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AirbridgeReactNative.initializeSDK(name: "YOUR_APP_NAME", token:"YOUR_APP_SDK_TOKEN")
...
}
#import <AirbridgeReactNative/AirbridgeReactNative.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AirbridgeReactNative initializeSDKWithName:@"YOUR_APP_NAME" token:@"YOUR_APP_SDK_TOKEN"];
...
}
android/app/src/main/java/.../MainApplication.kt
파일
import co.ab180.airbridge.reactnative.AirbridgeReactNative
...
override fun onCreate() {
super.onCreate()
AirbridgeReactNative.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
...
}
import co.ab180.airbridge.reactnative.AirbridgeReactNative;
...
@Override
public void onCreate() {
super.onCreate();
AirbridgeReactNative.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
...
}
에어브릿지 리액트 네이티브 SDK를 사용하기 위한 설정값을 입력해 주세요.
{
"sdkEnabled": boolean,
"logLevel": "debug" | "info" | "warning" | "error" | "fault",
"autoStartTrackingEnabled": boolean,
"autoDetermineTrackingAuthorizationTimeoutInSecond": number,
"trackMetaDeferredAppLinkEnabled": boolean,
"sessionTimeoutInSecond": number,
"metaInstallReferrerAppID": string,
"trackAirbridgeDeeplinkOnlyEnabled": boolean,
"trackInSessionLifecycleEventEnabled": boolean,
"hashUserInformationEnabled": boolean,
"sdkSignatureID": string,
"sdkSignatureSecret": string,
"clearEventBufferOnInitializeEnabled": boolean,
"eventBufferCountLimit": number,
"eventBufferSizeLimitInGibibyte": number,
"eventTransmitIntervalInSecond": number,
"isHandleAirbridgeDeeplinkOnly": boolean,
"collectTCFDataEnabled": boolean
}
1. 리액트 네이티브 프로젝트 폴더 최상단에 airbridge.json
파일을 생성하고 위와 같이 JSON을 입력합니다.
2. 설정이 필요하지 않은 값은 키값을 생략합니다.
AndroidManifest.xml
파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.
<manifest>
태그의 xmlns:tools
에 내용을 추가해주세요.
<application>
태그에 android:allowBackup
이 있으면 tools:replace
에 값을 추가해주세요.
<application>
태그에 android:dataExtractionRules
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<application>
태그에 android:fullBackupContent
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...>
<application
android:allowBackup="..."
android:dataExtractionRules="..."
android:fullBackupContent="..."
tools:replace="android:allowBackup,android:dataExtractionRules,android:fullBackupContent"
...>
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</device-transfer>
</data-extraction-rules>
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</full-backup-content>
SDK는 유저가 ATT 프롬프트에서 동의 여부를 결정할 때까지 설치 이벤트를 수집하지 않고 디퍼드 딥링크도 작동하지 않습니다.
airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 통해 ATT 프롬프트에서 동의 여부에 대한 타임아웃을 설정 할 수 있습니다.
ATT 프롬프트에서 동의 여부를 받지 않고 타임아웃 발생 시 설치 이벤트를 수집 및 디퍼드 딥링크가 ATT 프롬프트에서 동의 여부와 관계 없이 작동 됩니다. 기본값은 30초입니다.
딥링크 플랜은 식별자를 활용한 어트리뷰션을 지원하지 않습니다. 따라서 디퍼드 딥링크에서 설정된 목적지로 앱을 설치한 유저를 지연 없이 보내기 위해서 airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 0초로 설정하세요.
{
"autoDetermineTrackingAuthorizationTimeoutInSecond": 0
}
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
아래 설명에 따라 iOS는 스킴 딥링크 앱 설정과 유니버셜 링크 앱 설정, 그리고 Android는 스킴 딥링크 앱 설정과 앱 링크(App Links) 설정을 완료하세요.
ios/YOUR_PROJECT_NAME.xcodeproj
파일
스킴 딥링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동하고 '+'를 클릭합니다. 그리고 YOUR_SCHEME
을 입력합니다.
유니버셜 링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동하고 '+ Capability'를 클릭합니다. 그리고 Associated Domains를 선택하고 applinks:YOUR_APP_NAME.airbridge.io
와 applinks:YOUR_APP_NAME.abr.ge
를 추가합니다.
android/app/src/main/AndroidManifest.xml
파일
스킴 딥링크 앱 설정
intent-filter
에 YOUR_SCHEME
를 추가 합니다.
앱 링크 설정
intent-filter
에 YOUR_APP_NAME.airbridge.io
와 YOUR_APP_NAME.abr.ge
를 추가 합니다.
<application ...>
...
<activity android:name=".DeeplinkActivity" ...>
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_SCHEME: Input your Android URI Scheme -->
<data android:scheme="YOUR_SCHEME" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
...
</activity>
...
</application>
YOUR_SCHEME
은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 ://
없이 사용합니다. YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
앱이 딥링크로 열릴 때, trackDeeplink
함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요.
ios/YOUR_PROJECT_NAME/AppDelegate.m
파일
import AirbridgeReactNative
...
// when app is opened with scheme deeplink
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
// track deeplink
AirbridgeReactNative.trackDeeplink(url: url)
return true
}
...
// when app is opened with universal links
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
// track deeplink
AirbridgeReactNative.trackDeeplink(userActivity: userActivity)
return true
}
#import <AirbridgeReactNative/AirbridgeReactNative.h>
...
// when app is opened with scheme deeplink
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// track deeplink
[AirbridgeReactNative trackDeeplinkWithUrl:url];
return YES;
}
...
// when app is opened with universal links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// track deeplink
[AirbridgeReactNative trackDeeplinkWithUserActivity:userActivity];
return YES;
}
android/app/src/main/java/.../MainActivity.kt
파일
import co.ab180.airbridge.reactnative.AirbridgeReactNative
...
override fun onResume() {
super.onResume()
AirbridgeReactNative.trackDeeplink(intent)
}
...
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
}
import co.ab180.airbridge.reactnative.AirbridgeReactNative;
...
@Override
protected void onResume() {
super.onResume();
AirbridgeReactNative.trackDeeplink(getIntent());
}
...
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
setOnDeeplinkReceived
함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.
import { Airbridge } from 'airbridge-react-native-sdk'
...
Airbridge.setOnDeeplinkReceived((url) => {
// show proper content using url
})
디퍼드 딥링크를 위한 별도의 설정이 필요하지 않습니다. 앱을 설치하지 않은 유저가 트래킹 링크를 클릭하면 앱 스토어로 랜딩시켜 앱 설치를 유도할 수 있습니다. 해당 유저가 앱을 설치 후 실행 시 트래킹 링크에 설정된 딥링크 OnDeeplinkReceived
함수에 자동으로 전달됩니다.
에어브릿지 플러터 SDK를 설치합니다.
pubspec.yaml
파일의 dependencies
블럭 안에 다음과 같은 라인을 추가해 주세요. 그리고 아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION
에 입력하세요.
SDK 버전 목록: 링크
dependencies:
# Replace $HERE_LATEST_VERSION with latest version
# - Versions: https://pub.dev/packages/airbridge_flutter_sdk/versions
# - Example: airbridge_flutter_sdk: 0.0.0
airbridge_flutter_sdk: $HERE_LATEST_VERSION
해당 프로젝트의 최상위 파일의 위치에서 Terminal
을 열어 다음 명령어를 실행해 주세요.
Airbridge Flutter SDK 는 Flutter 1.20.0 이상, Dart 2.12.0 이상 에서만 작동합니다.
flutter pub get
앱이 열릴 때, SDK를 초기화해주세요.
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
ios/YOUR_PROJECT_NAME/AppDelegate.m
파일
import airbridge_flutter_sdk
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AirbridgeFlutter.initializeSDK(name: "YOUR_APP_NAME", token:"YOUR_APP_SDK_TOKEN")
...
}
#import <AirbridgeFlutter/AirbridgeFlutter.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AirbridgeFlutter initializeSDKWithName:@"YOUR_APP_NAME" token:@"YOUR_APP_SDK_TOKEN"];
...
}
android/app/src/main/java/.../MainApplication.kt
파일
import co.ab180.airbridge.flutter.AirbridgeFlutter
...
override fun onCreate() {
super.onCreate()
AirbridgeFlutter.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
...
}
import co.ab180.airbridge.flutter.AirbridgeFlutter;
...
@Override
public void onCreate() {
super.onCreate();
AirbridgeFlutter.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
...
}
에어브릿지 플러터 SDK를 사용하기 위한 설정값을 입력합니다.
{
"sdkEnabled": boolean,
"logLevel": "debug" | "info" | "warning" | "error" | "fault",
"autoStartTrackingEnabled": boolean,
"autoDetermineTrackingAuthorizationTimeoutInSecond": number,
"trackMetaDeferredAppLinkEnabled": boolean,
"sessionTimeoutInSecond": number,
"metaInstallReferrerAppID": string,
"trackAirbridgeDeeplinkOnlyEnabled": boolean,
"trackInSessionLifecycleEventEnabled": boolean,
"hashUserInformationEnabled": boolean,
"sdkSignatureID": string,
"sdkSignatureSecret": string,
"clearEventBufferOnInitializeEnabled": boolean,
"eventBufferCountLimit": number,
"eventBufferSizeLimitInGibibyte": number,
"eventTransmitIntervalInSecond": number,
"isHandleAirbridgeDeeplinkOnly": boolean,
"collectTCFDataEnabled": boolean
}
1. 리액트 네이티브 프로젝트 폴더 최상단에 airbridge.json
파일을 생성하고 위와 같이 JSON을 입력합니다.
2. 설정이 필요하지 않은 값은 키값을 생략합니다.
AndroidManifest.xml
파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.
<manifest>
태그의 xmlns:tools
에 내용을 추가해주세요.
<application>
태그에 android:allowBackup
이 있으면 tools:replace
에 값을 추가해주세요.
<application>
태그에 android:dataExtractionRules
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<application>
태그에 android:fullBackupContent
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...>
<application
android:allowBackup="..."
android:dataExtractionRules="..."
android:fullBackupContent="..."
tools:replace="android:allowBackup,android:dataExtractionRules,android:fullBackupContent"
...>
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</device-transfer>
</data-extraction-rules>
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</full-backup-content>
SDK는 유저가 ATT 프롬프트에서 동의 여부를 결정할 때까지 설치 이벤트를 수집하지 않고 디퍼드 딥링크도 작동하지 않습니다.
airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 통해 ATT 프롬프트에서 동의 여부에 대한 타임아웃을 설정 할 수 있습니다.
ATT 프롬프트에서 동의 여부를 받지 않고 타임아웃 발생 시 설치 이벤트를 수집 및 디퍼드 딥링크가 ATT 프롬프트에서 동의 여부와 관계 없이 작동 됩니다. 기본값은 30초입니다.
딥링크 플랜은 식별자를 활용한 어트리뷰션을 지원하지 않습니다. 따라서 디퍼드 딥링크에서 설정된 목적지로 앱을 설치한 유저를 지연 없이 보내기 위해서 airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 0초로 설정하세요.
{
"autoDetermineTrackingAuthorizationTimeoutInSecond": 0
}
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
아래 설명에 따라 iOS는 스킴 딥링크 앱 설정과 유니버셜 링크 앱 설정, 그리고 Android는 스킴 딥링크 앱 설정과 앱 링크(App Links) 설정을 완료하세요.
ios/YOUR_PROJECT_NAME.xcodeproj
파일
스킴 딥링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동하고 '+'를 클릭합니다. 그리고 YOUR_SCHEME
을 입력합니다.
유니버셜 링크 앱 설정
Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동하고 '+ Capability'를 클릭합니다. 그리고 Associated Domains를 선택하고 applinks:YOUR_APP_NAME.airbridge.io
와 applinks:YOUR_APP_NAME.abr.ge
를 추가합니다.
android/app/src/main/AndroidManifest.xml
파일
스킴 딥링크 앱 설정
intent-filter
에 YOUR_SCHEME
를 추가 합니다.
앱 링크 설정
intent-filter
에 YOUR_APP_NAME.airbridge.io
와 YOUR_APP_NAME.abr.ge
를 추가 합니다.
<application ...>
...
<activity android:name=".DeeplinkActivity" ...>
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_SCHEME: Input your Android URI Scheme -->
<data android:scheme="YOUR_SCHEME" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- YOUR_APP_NAME: Input your App Name -->
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
...
</activity>
...
</application>
YOUR_SCHEME
은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 ://
없이 사용합니다. YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
앱이 딥링크로 열릴 때, trackDeeplink
함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요.
ios/YOUR_PROJECT_NAME/AppDelegate.m
파일
import airbridge_flutter_sdk
...
// when app is opened with scheme deeplink
override func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
// track deeplink
AirbridgeFlutter.trackDeeplink(url: url)
return true
}
...
// when app is opened with universal links
override func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
// track deeplink
AirbridgeFlutter.trackDeeplink(userActivity: userActivity)
return true
}
#import <AirbridgeFlutter/AirbridgeFlutter.h>
...
// when app is opened with scheme deeplink
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// track deeplink
[AirbridgeFlutter trackDeeplinkWithUrl:url];
return YES;
}
...
// when app is opened with universal links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// track deeplink
[AirbridgeFlutter trackDeeplinkWithUserActivity:userActivity];
return YES;
}
android/app/src/main/java/.../MainActivity.kt
파일
import co.ab180.airbridge.flutter.AirbridgeFlutter
...
override fun onResume() {
super.onResume()
AirbridgeFlutter.trackDeeplink(intent)
}
...
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
}
import co.ab180.airbridge.flutter.AirbridgeFlutter;
...
@Override
protected void onResume() {
super.onResume();
AirbridgeFlutter.trackDeeplink(getIntent());
}
...
@Override
public void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
setOnDeeplinkReceived
함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.
import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
...
Airbridge.setOnDeeplinkReceived((url) {
// show proper content using url
});
디퍼드 딥링크를 위한 별도의 설정이 필요하지 않습니다. 앱을 설치하지 않은 유저가 트래킹 링크를 클릭하면 앱 스토어로 랜딩시켜 앱 설치를 유도할 수 있습니다. 해당 유저가 앱을 설치 후 실행 시 트래킹 링크에 설정된 딥링크 OnDeeplinkReceived
함수에 자동으로 전달됩니다.
에어브릿지 엑스포 SDK를 설치합니다.
npm install --save airbridge-expo-sdk
npm install --save airbridge-react-native-sdk
앱에서 사용하는 생명주기에 따라 앱이 열릴 때, SDK를 초기화하세요.
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
{
"expo": {
...
"plugins": [
...
[
"airbridge-expo-sdk",
{
"appName": "APP_NAME",
"appToken": "APP_TOKEN"
}
]
]
}
}
에어브릿지 엑스포 SDK를 사용하기 위한 설정값을 입력합니다.
{
"sdkEnabled": boolean,
"logLevel": "debug" | "info" | "warning" | "error" | "fault",
"autoStartTrackingEnabled": boolean,
"autoDetermineTrackingAuthorizationTimeoutInSecond": number,
"trackMetaDeferredAppLinkEnabled": boolean,
"sessionTimeoutInSecond": number,
"metaInstallReferrerAppID": string,
"trackAirbridgeDeeplinkOnlyEnabled": boolean,
"trackInSessionLifecycleEventEnabled": boolean,
"hashUserInformationEnabled": boolean,
"sdkSignatureID": string,
"sdkSignatureSecret": string,
"clearEventBufferOnInitializeEnabled": boolean,
"eventBufferCountLimit": number,
"eventBufferSizeLimitInGibibyte": number,
"eventTransmitIntervalInSecond": number,
"isHandleAirbridgeDeeplinkOnly": boolean,
"collectTCFDataEnabled": boolean
}
1. 엑스포 프로젝트 폴더 최상단에 airbridge.json
파일을 생성하고 위와 같이 JSON을 입력합니다.
2. 설정이 필요하지 않은 값은 키값을 생략합니다.
AndroidManifest.xml
파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.
<manifest>
태그의 xmlns:tools
에 내용을 추가해주세요.
<application>
태그에 android:allowBackup
이 있으면 tools:replace
에 값을 추가해주세요.
<application>
태그에 android:dataExtractionRules
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<application>
태그에 android:fullBackupContent
이 있으면 tools:replace
에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
...>
<application
android:allowBackup="..."
android:dataExtractionRules="..."
android:fullBackupContent="..."
tools:replace="android:allowBackup,android:dataExtractionRules,android:fullBackupContent"
...>
<?xml version="1.0" encoding="utf-8"?>
<data-extraction-rules>
<cloud-backup>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</cloud-backup>
<device-transfer>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</device-transfer>
</data-extraction-rules>
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="sharedpref" path="airbridge-device-alias" />
<exclude domain="database" path="airbridge.db" />
</full-backup-content>
SDK는 유저가 ATT 프롬프트에서 동의 여부를 결정할 때까지 설치 이벤트를 수집하지 않고 디퍼드 딥링크도 작동하지 않습니다.
airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 통해 ATT 프롬프트에서 동의 여부에 대한 타임아웃을 설정 할 수 있습니다.
ATT 프롬프트에서 동의 여부를 받지 않고 타임아웃 발생 시 설치 이벤트를 수집 및 디퍼드 딥링크가 ATT 프롬프트에서 동의 여부와 관계 없이 작동 됩니다. 기본값은 30초입니다.
딥링크 플랜은 식별자를 활용한 어트리뷰션을 지원하지 않습니다. 따라서 디퍼드 딥링크에서 설정된 목적지로 앱을 설치한 유저를 지연 없이 보내기 위해서 airbridge.json
의 autoDetermineTrackingAuthorizationTimeoutInSecond
설정값을 0초로 설정하세요.
{
"autoDetermineTrackingAuthorizationTimeoutInSecond": 0
}
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
아래 예시와 같이 scheme 에는 YOUR_SCHEME
을 입력하세요. iOS는 associatedDomains
에 유니버셜 링크 앱 설정을 Android는 intentFilters
에 앱 링크(App Links) 설정을 완료하세요.
{
"expo": {
...
"scheme": "YOUR_SCHEME",
"android": {
...
"intentFilters": [{
"autoVerify": true,
"action": "VIEW",
"data": { "scheme": "https", "host": "APP_NAME.airbridge.io" },
"category": ["BROWSABLE", "DEFAULT"]
}, {
"autoVerify": true,
"action": "VIEW",
"data": { "scheme": "https", "host": "APP_NAME.abr.ge" },
"category": ["BROWSABLE", "DEFAULT"]
}, {
"autoVerify": true,
"action": "VIEW",
"data": { "scheme": "http", "host": "APP_NAME.airbridge.io" },
"category": ["BROWSABLE", "DEFAULT"]
}, {
"autoVerify": true,
"action": "VIEW",
"data": { "scheme": "http", "host": "APP_NAME.abr.ge" },
"category": ["BROWSABLE", "DEFAULT"]
}]
},
"ios": {
...
"associatedDomains": [
"applinks:APP_NAME.airbridge.io",
"applinks:APP_NAME.abr.ge"
]
}
}
}
YOUR_SCHEME
은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 ://
없이 사용합니다. APP_NAME
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
setOnDeeplinkReceived 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 전달됩니다. 그리고 유저가 화면으로 이동할 수 있도록 설정하세요.
import { Airbridge } from 'airbridge-react-native-sdk'
...
Airbridge.setOnDeeplinkReceived((url) => {
// show proper content using url
})
디퍼드 딥링크를 위한 별도의 설정이 필요하지 않습니다.
앱을 설치하지 않은 유저가 트래킹 링크를 클릭하면 앱 스토어로 랜딩시켜 앱 설치를 유도할 수 있습니다. 해당 유저가 앱을 설치 후 실행 시 트래킹 링크에 설정된 딥링크 OnDeeplinkReceived
함수에 자동으로 전달됩니다.
아래 테스트를 완료하세요.
에어브릿지 대시보드 [설정]>[테스트 콘솔]>[앱 설치 이벤트]로 이동합니다.
테스트 디바이스의 ADID(GAID 또는 IDFA)를 입력합니다.
테스트 디바이스에서 앱을 삭제하고 QR 코드를 스캔합니다.
테스트 결과를 확인합니다.
테스트를 통과하지 않는다면 [SDK 설정하기]>[SDK 초기화하기]를 제대로 진행했는지 확인합니다.
에어브릿지 대시보드 [설정]>[테스트 콘솔]>[딥링킹]으로 이동합니다.
테스트할 앱의 딥링크를 입력합니다. (예: scheme://product/12345
)
각 [설정 확인]을 클릭하여 대시보드 안내에 따라 테스트 디바이스로 QR 코드를 스캔합니다.
테스트 결과를 확인합니다.
테스트를 통과하지 않는다면 [대시보드 설정하기]와 [SDK 설정하기]>[딥링크 설정하기]를 제대로 진행했는지 확인합니다.
도움이 되었나요?