에어브릿지로 이동합니다.
에어브릿지 대시보드에서 [새로운 앱 등록]을 클릭해 앱을 등록합니다.
앱을 등록한 후에 해당 앱의 에어브릿지 대시보드 [트래킹링크]>[딥링크]에서 딥링크 정보를 등록합니다.
안드로이드 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를 설치합니다. SDK를 설치할 프로젝트의 build.gradle
또는 settings.gradle
중 repositories
블락이 있는 파일에 SDK 저장소를 선언하세요. 그리고 어플리케이션의 build.gradle
파일에서 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 {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation "io.airbridge:sdk-android:$HERE_LATEST_VERSION"
// For example
// implementation "io.airbridge:sdk-android:0.0.0"
}
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation("io.airbridge:sdk-android:$HERE_LATEST_VERSION")
// For example
// implementation("io.airbridge:sdk-android:0.0.0")
}
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
에 추가하세요. 그리고 에어브릿지 딥링크 3개를 Intent Filter
에 추가하세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.
<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
클래스의 onCreate
함수에서 handleDeeplink
함수를 호출해 에어브릿지 딥링크를 트래킹 링크에 설정된 딥링크로 변환하도록 설정합니다. 그리고 유저가 앱 페이지로 이동할 수 있도록 설정하세요.
앱이 에어브릿지 딥링크로 실행되면 isAirbridgeDeeplink
는 true
가 되고, 콜백함수의 uri
에는 설정된 딥링크가 전달됩니다.
앱이 다른 플랫폼의 딥링크로 실행되면 isAirbridgeDeeplink
는 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
함수를 호출하는 클래스, 함수, 시점은 자유롭게 바꿔도 됩니다.)
앱을 설치하고 함수가 처음으로 호출되면 isFirstCalled
는 true
가 되고, 콜백의 uri
에는 앱을 설치하기 전에 트래킹링크를 열었다면 설정된 딥링크가, 아니라면 null
이 전달됩니다.
앱을 설치하고 함수가 이후로 호출되면 isFirstCalled
는 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
}
}
trackEvent
함수를 호출해 이벤트를 전송하도록 설정합니다. 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하는 것을 권장합니다. 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수도 있습니다. 자세한 내용은 Android SDK 가이드를 참고하세요.
Airbridge.trackEvent(
// StandardCategory
AirbridgeCategory.ORDER_COMPLETED, // or "CustomEvent" (CustomCategory)
// SemanticAttributes
mapOf(
AirbridgeAttribute.VALUE to 11,
AirbridgeAttribute.TRANSACTION_ID to "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.IN_APP_PURCHASED to true,
),
// CustomAttributes
mapOf(
"key" to "value",
)
)
Airbridge.trackEvent(
// StandardCategory
AirbridgeCategory.ORDER_COMPLETED, // or "CustomEvent" (CustomCategory)
// SemanticAttributes
new HashMap() {{
put(AirbridgeAttribute.VALUE, 11);
put(AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.IN_APP_PURCHASED, true);
}},
// CustomAttributes
new HashMap() {{
put("key", "value");
}}
);
전체 내용은 iOS SDK 문서를 참고해주세요.
에어브릿지 iOS SDK를 설치합니다.
1. Xcode에서 [File]에서 [Add Packages...]를 클릭해 주세요.
2. 검색창에 아래 주소를 입력하고 [Add Package]를 클릭합니다.
- https://github.com/ab180/airbridge-ios-sdk-deployment
3. [Add Package]를 계속해서 클릭합니다.
4. Xcode의 [Package Dependencies]에서 에어브릿지 iOS SDK 추가를 확인할 수 있습니다.
target '[Project Name]' do
...
# choose YOUR_VERSION from https://help.airbridge.io/developers/release-note-ios-sdk
# example: pod 'airbridge-ios-sdk', '4.X.X'
pod 'airbridge-ios-sdk', 'YOUR_VERSION'
...
end
import ProjectDescription
let project = Project(
packages: [
.remote(
url: "https://github.com/ab180/airbridge-ios-sdk-deployment",
// choose YOUR_VERSION from https://help.airbridge.io/developers/release-note-ios-sdk
// example: requirement: .exact(from: "4.X.X")
requirement: .exact(from: "YOUR_VERSION")
),
...
],
targets: [
.target(
dependencies: [
.package(product: "Airbridge", type: .runtime),
...
]
),
...
],
...
)
앱에서 사용하는 생명주기에 따라 앱이 열릴 때, SDK를 초기화하세요.
YOUR_APP_NAME
과 YOUR_APP_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
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
ATT 프롬프트를 제공할 때 사용할 문구를 정해서 Info.plist
파일의 NSUserTrackingUsageDescription
키에 입력합니다.
1. Xcode > YOUR_PROJECT > Info > Custom iOS Target Properties로 이동해주세요.
2. Key의 항목들에 마우스를 가져가면 표시되는 `+` 버튼을 누르고 `Privacy - Tracking Usage Description` 를 입력해 주세요.
3. Value에 표시할 문구를 입력해 주세요.
import ProjectDescription
let project = Project(
targets: [
.target(
infoPlist: .extendingDefault(
with: [
"NSUserTrackingUsageDescription": "YOUR_DESCRIPTION",
...
]
),
...
),
...
]
...
)
유저가 앱을 실행한 직후 또는 다른 원하는 시점에 ATT 프롬프트가 디바이스에 나타나도록 설정합니다.
import AppTrackingTransparency
...
var observer: Any?
observer = NotificationCenter.default.addObserver(
forName: UIApplication.didBecomeActiveNotification,
object: nil,
queue: nil
) { [weak self] _ in
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { _ in }
}
if let observer = self?.observer {
NotificationCenter.default.removeObserver(observer)
}
}
#import <Airbridge/Airbridge.h>
#import <AppTrackingTransparency/AppTrackingTransparency.h>
...
__weak id observer;
observer = [NSNotificationCenter.defaultCenter addObserverForName:UIApplicationDidBecomeActiveNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull notification) {
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {}];
}
if (observer != nil) {
[NSNotificationCenter.defaultCenter removeObserver:observer];
}
}];
SDK는 유저가 ATT 프롬프트에서 동의 여부를 결정할 때까지 설치 이벤트를 수집하지 않고 디퍼드 딥링크를 작동하지 않습니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME",
token: "YOUR_APP_SDK_TOKEN")
.setAutoDetermineTrackingAuthorizationTimeout(second: 30)
.build()
Airbridge.initializeSDK(option: option)
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
[optionBuilder setAutoDetermineTrackingAuthorizationTimeoutWithSecond:30];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.
1. Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동합니다.
2. `+` 를 클릭한 후에 `URL Schemes` 에 대시보드에서 입력한 `iOS URI 스킴` 을 `://` 을 제외하고 입력합니다. 예: `scheme`
3. Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동합니다.
4. `+ Capability` 를 클릭하면 `Associated Domains` 를 추가할 수 있습니다.
5. `Associated Domains` 에 `applinks:YOUR_APP_NAME.airbridge.io` 와 `applinks:YOUR_APP_NAME.abr.ge` 를 추가합니다.
- `YOUR_APP_NAME` 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
앱에서 사용하는 생명주기에 따라 앱이 딥링크로 열릴 때, trackDeeplink
함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요. 그리고 handleDeeplink
함수를 호출해 에어브릿지 딥링크를 트래킹 링크에 설정된 스킴 딥링크로 변환하도록 설정합니다. 그리고 유저가 앱 페이지로 이동할 수 있도록 설정하세요.
앱이 에어브릿지 딥링크로 실행되면 isAirbridgeDeeplink
는 true
가 되고, 콜백함수의 url
에는 설정된 딥링크가 전달됩니다.
앱이 다른 플랫폼의 딥링크로 실행되면 isAirbridgeDeeplink
는 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
함수를 호출하는 클래스, 함수, 시점은 자유롭게 바꿔도 됩니다.)
앱을 설치하고 함수가 처음으로 호출되면 isFirstCalled
는 true
가 되고, 콜백의 uri
에는 앱을 설치하기 전에 트래킹링크를 열었다면 설정된 딥링크가, 아니라면 null
이 전달됩니다.
앱을 설치하고 함수가 이후로 호출되면 isFirstCalled
는 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
trackEvent
함수를 호출해 이벤트를 전송하도록 설정합니다. 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하는 것을 권장합니다. 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수도 있습니다. 자세한 내용은 iOS SDK 가이드를 참고하세요.
Airbridge.trackEvent(
// StandardCategory
category: AirbridgeCategory.ORDER_COMPLETED, // or "CustomEvent" (CustomCategory)
// SemanticAttributes
semanticAttributes: [
AirbridgeAttribute.VALUE: 11,
AirbridgeAttribute.TRANSACTION_ID: "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY: "USD",
AirbridgeAttribute.IN_APP_PURCHASED: true,
],
// CustomAttributes
customAttributes: [
"key": "value",
]
)
// StandardCategory
// or "CustomEvent" (CustomCategory)
[Airbridge trackEventWithCategory:@"event" semanticAttributes:@{
// SemanticAttributes
AirbridgeAttribute.VALUE: @(11),
AirbridgeAttribute.TRANSACTION_ID: @"8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY: @"USD",
AirbridgeAttribute.IN_APP_PURCHASED: @(YES),
} customAttributes:@{
// CustomAttributes
@"key": @"value",
}];
전체 내용은 웹 SDK 문서를 참고해주세요.
에어브릿지 웹 SDK를 설치합니다.
<!-- Add to <head> tag -->
<script>
(function(a_,i_,r_,_b,_r,_i,_d,_g,_e){if(!a_[_b]){var n=function(){var c=i_.createElement(r_);c.onerror=function(){g.queue.filter(function(a){return 0<=_d.indexOf(a[0])}).forEach(function(a){a=a[1];a=a[a.length-1];"function"===typeof a&&a("error occur when load airbridge")})};c.async=1;c.src=_r;"complete"===i_.readyState?i_.head.appendChild(c):a_.addEventListener("load",function h(){a_.removeEventListener("load",h);i_.head.appendChild(c)})},g={queue:[],get isSDKEnabled(){return!1}};_i.concat(_d).forEach(function(c){var a=c.split("."),h=a.pop();a.reduce(function(p,q){return p[q]=p[q]||{}},g)[h]=function(){g.queue.push([c,arguments])}});a_[_b]=g;0<_g?(_b=new (a_.XDomainRequest||a_.XMLHttpRequest),_i=function(){},_b.open("GET",_r),_b.timeout=_g,_b.onload=function(){n()},_b.onerror=_i,_b.onprogress=_i,_b.ontimeout=_i,_b.send()):n()}})(window,document,"script","airbridge","//static.airbridge.io/sdk/latest/airbridge.min.js","init startTracking stopTracking fetchResource openBanner setBanner setDownload setDownloads openDeeplink setDeeplinks sendWeb setUserAgent setMobileAppData setUserID clearUserID setUserEmail clearUserEmail setUserPhone clearUserPhone setUserAttribute removeUserAttribute clearUserAttributes setUserAlias removeUserAlias clearUserAlias clearUser setUserId setUserAttributes addUserAlias setDeviceAlias removeDeviceAlias clearDeviceAlias setDeviceIFV setDeviceIFA setDeviceGAID events.send events.signIn events.signUp events.signOut events.purchased events.addedToCart events.productDetailsViewEvent events.homeViewEvent events.productListViewEvent events.searchResultViewEvent".split(" "),["events.wait","createTouchpoint"],0);
</script>
# import airbridge from 'airbridge-web-sdk-loader'
npm install airbridge-web-sdk-loader
# import airbridge from 'airbridge-web-sdk-loader'
yarn add airbridge-web-sdk-loader
# import airbridge from 'airbridge-web-sdk-loader'
pnpm install airbridge-web-sdk-loader
웹사이트가 열릴 때, SDK를 초기화해주세요.
YOUR_APP_NAME
과 YOUR_WEB_SDK_TOKEN
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
airbridge.init({
app: 'YOUR_APP_NAME',
webToken: 'YOUR_WEB_SDK_TOKEN',
})
유저를 웹사이트에서 앱으로 보내기 위해서는 openDeeplink
함수를 호출해 앱을 설치한 유저는 앱으로, 앱을 설치하지 않은 유저는 앱 스토어 또는 웹사이트로 보내도록 설정하세요.
airbridge.openDeeplink({
deeplinks: {
ios: 'example://detail?id=1',
android: 'example://detail?id=1',
desktop: 'https://example.com/detail?id=1'
},
fallbacks: {
ios: 'itunes-appstore', // or 'https://example.com'
android: 'google-play' // or 'https://example.com'
}
})
trackEvent
함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 웹 SDK 가이드를 참고해주세요.
// StandardCategory
// or "CustomEvent" (CustomCategory)
airbridge.events.send('airbridge.ecommerce.order.completed', {
value: 11,
// SemanticAttributes
semanticAttributes: {
transactionID: '8065ef16-162b-4a82-b683-e51aefdda7d5',
currency: 'USD',
inAppPurchased: true,
},
// CustomAttributes
customAttributes: {
key: 'value',
}
})
전체 내용은 리액트 네이티브 SDK 문서를 참고해주세요.
에어브릿지 리액트 네이티브 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>
ATT 프롬프트를 애플 가이드에 따라 원하는 시점에 표시해주세요.
SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)
리액트 네이티브 프로젝트 폴더 최상단에 airbridge.json
파일을 생성하고 설정해주세요.
{
"autoDetermineTrackingAuthorizationTimeoutInSecond": 30
}
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹링크가 열릴 때 설정된 딥링크를 상황에 따라 3개 중 최적의 에어브릿지 딥링크로 변환해 앱을 엽니다.
ios/YOUR_PROJECT_NAME.xcodeproj
파일
1. Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동합니다.
2. `+` 를 클릭한 후에 `URL Schemes` 에 대시보드에서 입력한 `iOS URI 스킴` 을 `://` 을 제외하고 입력합니다. 예: `scheme`
3. Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동합니다.
4. `+ Capability` 를 클릭하면 `Associated Domains` 를 추가할 수 있습니다.
5. `Associated Domains` 에 `applinks:YOUR_APP_NAME.airbridge.io` 와 `applinks:YOUR_APP_NAME.abr.ge` 를 추가합니다.
- `YOUR_APP_NAME` 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
android/app/src/main/AndroidManifest.xml
파일
<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>
앱이 딥링크로 열릴 때, 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
에 전달되기 때문에 별도의 설정이 필요하지 않습니다.
trackEvent
함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 리엑트 네이티브 SDK 가이드를 참고해주세요.
import { Airbridge, AirbridgeCategory, AirbridgeAttribute } from 'airbridge-react-native-sdk'
// StandardCategory
// or "CustomEvent" (CustomCategory)
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED, {
// SemanticAttributes
[AirbridgeAttribute.VALUE]: 11,
[AirbridgeAttribute.TRANSACTION_ID]: '8065ef16-162b-4a82-b683-e51aefdda7d5',
[AirbridgeAttribute.CURRENCY]: 'USD',
[AirbridgeAttribute.IN_APP_PURCHASED]: true,
}, {
// CustomAttributes
'key': 'value',
})
전체 내용은 유니티 SDK 문서를 참고해주세요.
에어브릿지 유니티 SDK를 다운로드한 후, SDK를 설치할 유니티 프로젝트에서 해당 SDK 패키지를 임포트하세요. 설치가 완료되면 유니티 상단에 Airbridge
탭이 표시됩니다.
유니티 상단 메뉴에서 Airbridge > Airbridge Settings
를 클릭하고, 필요한 값을 입력해 SDK 초기화 설정을 완료하세요.
App Name
과 App Token
은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
커스텀 메인 매니페스트 (Assets/Plugins/Android/AndroidManifest.xml
) 파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.
<manifest>
태그에 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>
ATT 프롬프트를 애플 가이드에 따라 원하는 시점에 표시해주세요.
SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)
딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.
SDK 초기화 단계에서 App Name
, iOS URI Scheme
, Android URI Scheme
값을 설정하세요.
커스텀 iOS AppDelegate 또는 커스텀 안드로이드 액티비티를 사용 중이라면, 아래 코드를 추가하여 SDK가 딥링크 이벤트를 수집할 수 있도록 설정하세요.
#import "AirbridgeUnity.h"
- (void)onOpenURL:(NSNotification *)notification {
NSURL* url = notification.userInfo[@"url"];
[Airbridge trackDeeplinkWithUrl:url];
if (AirbridgeUnity.sharedInstance.deeplinkOnReceived == nil) { return; }
AirbridgeUnity.sharedInstance.deeplinkOnReceived(url.absoluteString);
}
- (void)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>>* _Nullable))restorationHandler {
[Airbridge trackDeeplinkWithUserActivity:userActivity];
if (AirbridgeUnity.sharedInstance.deeplinkOnReceived == nil) { return; }
AirbridgeUnity.sharedInstance.deeplinkOnReceived(userActivity.webpageURL.absoluteString);
}
import co.ab180.airbridge.unity.AirbridgeUnity;
@Override
protected void onResume() {
super.onResume();
AirbridgeUnity.processHandleDeeplink(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
import co.ab180.airbridge.unity.AirbridgeUnity
override fun onResume() {
super.onResume()
AirbridgeUnity.processHandleDeeplink(intent)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
}
SetOnDeeplinkReceived
함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.
Airbridge.SetOnDeeplinkReceived((string deeplink) =>
{
// show proper content using url
});
디퍼드 딥링크는 자동으로 OnDeeplinkReceived
에 전달되기 때문에 별도의 설정이 필요하지 않습니다.
TrackEvent
함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 유니티 SDK
가이드를 참고해주세요.
Airbridge.TrackEvent(
// StandardCategory
// or "CustomEvent" (CustomCategory)
category: AirbridgeCategory.ORDER_COMPLETED,
// SemanticAttributes
semanticAttributes: new Dictionary<string, object>()
{
{ AirbridgeAttribute.VALUE, 11 },
{ AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5" },
{ AirbridgeAttribute.CURRENCY, "USD" },
{ AirbridgeAttribute.IN_APP_PURCHASED, true }
},
// CustomAttributes
customAttributes: new Dictionary<string, object>()
{
{ "key", "value" }
}
);
아래 테스트를 완료하세요.
에어브릿지 대시보드 [설정]>[테스트 콘솔]>[앱 설치 이벤트]로 이동해주세요.
테스트 디바이스의 ADID(GAID 또는 IDFA)를 입력해주세요.
테스트 디바이스에서 앱을 삭제하고 QR 코드를 스캔해주세요.
테스트 결과를 확인해주세요.
에어브릿지 대시보드 [설정]>[테스트 콘솔]>[딥링킹]으로 이동해주세요.
테스트할 앱의 딥링크를 입력해주세요. (예: scheme://product/12345
)
각 [설정 확인]을 클릭하여 대시보드 안내에 따라 테스트 디바이스로 QR 코드를 스캔합니다.
테스트 결과를 확인합니다.
도움이 되었나요?