SDK Quickstart

대시보드 설정하기

  1. 에어브릿지로 이동합니다.

  2. 에어브릿지 대시보드에서 [새로운 앱 등록]을 클릭해 앱을 등록합니다.

  3. 앱을 등록한 후에 해당 앱의 에어브릿지 대시보드 [트래킹링크]>[딥링크]에서 딥링크 정보를 등록합니다.

안드로이드 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

해쉬값을 찾는 방법은 아래를 참고해주세요.

Shell
1
keytool -list -v -keystore YOUR_KEYSTORE.keystore
Result
1234
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 설치하기

에어브릿지 안드로이드 SDK를 설치합니다. SDK를 설치할 프로젝트의 build.gradle 또는 settings.gradlerepositories 블락이 있는 파일에 SDK 저장소를 선언하세요. 그리고 어플리케이션의 build.gradle 파일에서 SDK 패키지를 추가하세요.

아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION 에 입력하세요.

프로젝트 build.gradle 또는 settings.gradle 파일

12345
allprojects {
    repositories {
        maven { url = uri("https://sdk-download.airbridge.io/maven") }
    }
}
12345
allprojects {
    repositories {
        maven { url = uri("https://sdk-download.airbridge.io/maven") }
    }
}
12345
dependencyResolutionManagement {
    repositories {
        maven { url = uri("https://sdk-download.airbridge.io/maven") }
    }
}
12345
dependencyResolutionManagement {
    repositories {
        maven { url = uri("https://sdk-download.airbridge.io/maven") }
    }
}

어플리케이션 build.gradle 파일

123456
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"
}
123456
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")
}

SDK 초기화하기

MainApplication 클래스를 생성하고 AndroidManifest.xml 에 추가하세요. 그리고 클래스의 onCreate 함수에서 SDK를 초기화하세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

AndroidManifest.xml
123
 <application
    android:name=".MainApplication"
    ...>
12345678910111213141516
import android.app.Application

import co.ab180.airbridge.Airbridge
import co.ab180.airbridge.AirbridgeOption
import co.ab180.airbridge.AirbridgeOptionBuilder

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)
    }
}
1234567891011121314151617
import android.app.Application;

import co.ab180.airbridge.Airbridge;
import co.ab180.airbridge.AirbridgeOption;
import co.ab180.airbridge.AirbridgeOptionBuilder;

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 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 에 추가하세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

AndroidManifest.xml
12345678910111213141516171819202122232425262728293031
<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 함수를 호출해 에어브릿지 딥링크를 트래킹 링크에 설정된 딥링크로 변환하도록 설정합니다. 그리고 유저가 앱 페이지로 이동할 수 있도록 설정하세요.

앱이 에어브릿지 딥링크로 실행되면 isAirbridgeDeeplinktrue 가 되고, 콜백함수의 uri 에는 설정된 딥링크가 전달됩니다.

앱이 다른 플랫폼의 딥링크로 실행되면 isAirbridgeDeeplinkfalse 가 되고, 콜백함수는 호출되지 않습니다.

123456789101112131415161718192021
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)
    }
}
1234567891011121314151617181920212223
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 함수를 호출하는 클래스, 함수, 시점은 자유롭게 바꿔도 됩니다.)

앱을 설치하고 함수가 처음으로 호출되면 isFirstCalledtrue 가 되고, 콜백의 uri 에는 앱을 설치하기 전에 트래킹링크를 열었다면 설정된 딥링크가, 아니라면 null 이 전달됩니다.

앱을 설치하고 함수가 이후로 호출되면 isFirstCalledfalse 가 되고, 콜백은 호출되지 않습니다.

123456789101112131415161718
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
    }
}
1234567891011121314151617181920
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
    }
}

주의하세요.

앱이 딥링크로 열리면 에어브릿지는 디퍼드딥링크 유무에 관계없이 null을 onSuccess에 전달해서 딥링크만 처리되도록 합니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송하도록 설정합니다. 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하는 것을 권장합니다. 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수도 있습니다. 자세한 내용은 Android SDK 가이드를 참고하세요.

12345678910111213141516
Airbridge.trackEvent(
    // StandardCategory
    // or "CustomEvent" (CustomCategory)
    AirbridgeCategory.ORDER_COMPLETED,
    // 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",
    )
)
12345678910111213141516
Airbridge.trackEvent(
    // StandardCategory
    // or "CustomEvent" (CustomCategory)
    AirbridgeCategory.ORDER_COMPLETED,
    // 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 문서를 참고해주세요.

SDK 설치하기

에어브릿지 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로 설정합니다.

주의하세요

[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 에 입력하세요.

Podfile
12345678
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.packagesremote를 추가합니다. SDK를 project.targets[...].target.dependenciespackage로, 의존성 Framework를 sdk로 추가합니다. 그리고 아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION 에 입력하세요.

  • SDK 버전 목록: 링크

  • 의존성 Framework 목록

123456789101112131415161718192021222324252627282930
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로 설정합니다.

SDK 초기화하기

앱에서 사용하는 생명주기에 따라 앱이 열릴 때, SDK를 초기화하세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

123456789101112131415
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
    }
}
123456789101112131415
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
    }
}
1234567891011
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)
    }
}
123456789101112131415161718
#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
123456789101112131415161718
#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 프롬프트 제공하기

ATT 프롬프트를 제공할 때 사용할 문구를 정해서 Info.plist 파일의 NSUserTrackingUsageDescription 키에 입력합니다.

  1. Xcode > YOUR_PROJECT > Info > Custom iOS Target Properties로 이동해주세요.

  2. Key의 항목들에 마우스를 가져가면 표시되는 + 버튼을 누르고 Privacy - Tracking Usage Description 를 입력해 주세요.

  3. Value에 표시할 문구를 입력해 주세요.

1. tuist edit 명령어를 실행해주세요.

2. project.targets[...].infoPlist.extendingDefault 에 키로 NSUserTrackingUsageDescription 를, 밸류로 문구를 입력해주세요.

1234567891011121314151617
import ProjectDescription

let project = Project(
    targets: [
        .target(
            infoPlist: .extendingDefault(
                with: [
                    "NSUserTrackingUsageDescription": "YOUR_DESCRIPTION",
                    ...
                ]
            ),
            ...
        ),
        ...
    ]
    ...
)

유저가 앱을 실행한 직후 또는 다른 원하는 시점에 ATT 프롬프트가 디바이스에 나타나도록 설정합니다.

123456789101112131415
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)
    }
}
123456789101112131415
#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초로 설정해주세요.)

1234567
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME",
                                    token: "YOUR_APP_SDK_TOKEN")
    .setAutoDetermineTrackingAuthorizationTimeout(second: 30)
    .build()
Airbridge.initializeSDK(option: option)
1234567
#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개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

스킴 딥링크 앱 설정

Xcode에서 [YOUR_PROJECT]>[Info]>[URL Types]로 이동하고 '+'를 클릭합니다. 그리고 YOUR_SCHEME 을 입력합니다.

유니버셜 링크 앱 설정

Xcode에서 [YOUR_PROJECT]>[Signing & Capabilities]로 이동하고 '+ Capability'를 클릭합니다. 그리고 Associated Domains를 선택하고 applinks:YOUR_APP_NAME.airbridge.ioapplinks:YOUR_APP_NAME.abr.ge 를 추가합니다.

딥링크로 유저를 이동시키기

앱에서 사용하는 생명주기에 따라 앱이 딥링크로 열릴 때, trackDeeplink 함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요. 그리고 handleDeeplink 함수를 호출해 에어브릿지 딥링크를 트래킹 링크에 설정된 스킴 딥링크로 변환하도록 설정합니다. 그리고 유저가 앱 페이지로 이동할 수 있도록 설정하세요.

앱이 에어브릿지 딥링크로 실행되면 isAirbridgeDeeplinktrue 가 되고, 콜백함수의 url 에는 설정된 딥링크가 전달됩니다.

앱이 다른 플랫폼의 딥링크로 실행되면 isAirbridgeDeeplinkfalse 가 되고, 콜백 함수는 호출되지 않습니다.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
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
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
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
    }
}
123456789101112131415161718192021222324
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
                }
        }
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
#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
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
#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 함수를 호출하는 클래스, 함수, 시점은 자유롭게 바꿔도 됩니다.)

앱을 설치하고 함수가 처음으로 호출되면 isFirstCalledtrue 가 되고, 콜백의 uri 에는 앱을 설치하기 전에 트래킹링크를 열었다면 설정된 딥링크가, 아니라면 null 이 전달됩니다.

앱을 설치하고 함수가 이후로 호출되면 isFirstCalledfalse 가 되고, 콜백은 호출되지 않습니다.

123456789101112131415161718192021222324
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
    }
}
123456789101112131415161718192021222324
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
    }
}
1234567891011121314151617181920
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
    }
}
123456789101112131415161718192021222324252627
#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
123456789101112131415161718192021222324252627
#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

주의하세요.

앱이 딥링크로 열리면 에어브릿지는 디퍼드딥링크 유무에 관계없이 null을 onSuccess에 전달해서 딥링크만 처리되도록 합니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송하도록 설정합니다. 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하는 것을 권장합니다. 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수도 있습니다. 자세한 내용은 iOS SDK 가이드를 참고하세요.

12345678910111213141516
Airbridge.trackEvent(
    // StandardCategory
    // or "CustomEvent" (CustomCategory)
    category: AirbridgeCategory.ORDER_COMPLETED,
    // 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",
    ]
)
123456789101112
// 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 설치하기

에어브릿지 웹 SDK를 설치합니다.

1234
<!-- 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>
1
npm install airbridge-web-sdk-loader
1
yarn add airbridge-web-sdk-loader
1
pnpm install airbridge-web-sdk-loader

npm, yarn, pnpm 방식으로 설치하면 아래와 같이 airbridgeimport 합니다. script 방식으로 설치하면 자동으로 windowairbridge 가 추가됩니다.

1
import airbridge from 'airbridge-web-sdk-loader'

SDK 초기화하기

웹사이트가 열릴 때, SDK를 초기화해주세요.

YOUR_APP_NAMEYOUR_WEB_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

1234
airbridge.init({
    app: 'YOUR_APP_NAME',
    webToken: 'YOUR_WEB_SDK_TOKEN',
})

딥링크 설정하기

유저를 웹사이트에서 앱으로 보내기 위해서는 openDeeplink 함수를 호출해 앱을 설치한 유저는 앱으로, 앱을 설치하지 않은 유저는 앱 스토어 또는 웹사이트로 보내도록 설정하세요.

1234567891011
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'
    }
})

이벤트 전송하기

events.send 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 웹 SDK 가이드를 참고해주세요.

123456789101112131415
// 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 설치하기

에어브릿지 리액트 네이티브 SDK를 설치합니다.

12
npm install airbridge-react-native-sdk
cd ios; pod install

SDK 초기화하기

앱이 열릴 때, SDK를 초기화해주세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

ios/YOUR_PROJECT_NAME/AppDelegate.m 파일

123456
import AirbridgeReactNative
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    AirbridgeReactNative.initializeSDK(name: "YOUR_APP_NAME", token:"YOUR_APP_SDK_TOKEN")
    ...
}
123456
#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 파일

1234567
import co.ab180.airbridge.reactnative.AirbridgeReactNative
...
override fun onCreate() {
    super.onCreate()
    AirbridgeReactNative.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    ...
}
12345678
import co.ab180.airbridge.reactnative.AirbridgeReactNative;
...
@Override
public void onCreate() {
    super.onCreate();
    AirbridgeReactNative.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
    ...
}

SDK 설정하기

에어브릿지 리액트 네이티브 SDK를 사용하기 위한 설정값을 입력해 주세요.

12345678910111213141516171819202122
{
    "sdkEnabled": boolean,
    "logLevel": "debug" | "info" | "warning" | "error" | "fault",
    "autoStartTrackingEnabled": boolean,
    "autoDetermineTrackingAuthorizationTimeoutInSecond": number,
    "trackMetaDeferredAppLinkEnabled": boolean,
    "sessionTimeoutInSecond": number,
    "metaInstallReferrerAppID": string,
    "trackAirbridgeDeeplinkOnlyEnabled": boolean,
    "trackingLinkCustomDomains": [string],
    "hashUserInformationEnabled": boolean,
    "sdkSignatureID": string,
    "sdkSignatureSecret": string,
    "clearEventBufferOnInitializeEnabled": boolean,
    "eventBufferCountLimit": number,
    "eventBufferSizeLimitInGibibyte": number,
    "eventTransmitIntervalInSecond": number,
    "isHandleAirbridgeDeeplinkOnly": boolean,
    "collectTCFDataEnabled": boolean,
    "trackingBlocklist": [string],
    "calculateSKAdNetworkByServerEnabled": 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 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

리액트 네이티브 프로젝트 폴더 최상단에 airbridge.json 파일을 생성하고 설정해주세요.

123
{
    "autoDetermineTrackingAuthorizationTimeoutInSecond": 30
}

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

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.ioapplinks:YOUR_APP_NAME.abr.ge 를 추가합니다.

android/app/src/main/AndroidManifest.xml 파일

AndroidManifest.xml
12345678910111213141516171819202122232425262728293031
<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 파일

12345678910111213141516171819202122232425
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
}
1234567891011121314151617
#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 파일

1234567891011
import co.ab180.airbridge.reactnative.AirbridgeReactNative
...
override fun onResume() {
    super.onResume()
    AirbridgeReactNative.trackDeeplink(intent)
}
...
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
}
12345678910111213
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 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

12345
import { Airbridge } from 'airbridge-react-native-sdk'
...
Airbridge.setOnDeeplinkReceived((url) => {
    // show proper content using url
})

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 리엑트 네이티브 SDK 가이드를 참고해주세요.

1234567891011121314
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를 설치합니다.

pubspec.yaml 파일의 dependencies 블럭 안에 다음과 같은 라인을 추가해 주세요. 그리고 아래 링크에서 최신버전을 확인하고 $HERE_LATEST_VERSION 에 입력하세요.

12345
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을 열어 다음 명령어를 실행해 주세요.

Shell
1
flutter pub get

Airbridge Flutter SDK 는 Flutter 1.20.0 이상, Dart 2.12.0 이상 에서만 작동합니다.

SDK 초기화하기

앱이 열릴 때, SDK를 초기화해주세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

ios/YOUR_PROJECT_NAME/AppDelegate.m 파일

123456
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")
    ...
}
123456
#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 파일

1234567
import co.ab180.airbridge.flutter.AirbridgeFlutter
...
override fun onCreate() {
    super.onCreate()
    AirbridgeFlutter.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    ...
}
12345678
import co.ab180.airbridge.flutter.AirbridgeFlutter;
...
@Override
public void onCreate() {
    super.onCreate();
    AirbridgeFlutter.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
    ...
}

SDK 설정하기

에어브릿지 플러터 SDK를 사용하기 위한 설정값을 입력합니다.

12345678910111213141516171819202122
{
    "sdkEnabled": boolean,
    "logLevel": "debug" | "info" | "warning" | "error" | "fault",
    "autoStartTrackingEnabled": boolean,
    "autoDetermineTrackingAuthorizationTimeoutInSecond": number,
    "trackMetaDeferredAppLinkEnabled": boolean,
    "sessionTimeoutInSecond": number,
    "metaInstallReferrerAppID": string,
    "trackAirbridgeDeeplinkOnlyEnabled": boolean,
    "trackingLinkCustomDomains": [string],
    "hashUserInformationEnabled": boolean,
    "sdkSignatureID": string,
    "sdkSignatureSecret": string,
    "clearEventBufferOnInitializeEnabled": boolean,
    "eventBufferCountLimit": number,
    "eventBufferSizeLimitInGibibyte": number,
    "eventTransmitIntervalInSecond": number,
    "isHandleAirbridgeDeeplinkOnly": boolean,
    "collectTCFDataEnabled": boolean,
    "trackingBlocklist": [string],
    "calculateSKAdNetworkByServerEnabled": 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 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

플러터 프로젝트 폴더 최상단에 airbridge.json 파일을 생성하고 설정해주세요.

123
{
    "autoDetermineTrackingAuthorizationTimeoutInSecond": 30
}

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

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.ioapplinks:YOUR_APP_NAME.abr.ge 를 추가합니다.

android/app/src/main/AndroidManifest.xml 파일

AndroidManifest.xml
12345678910111213141516171819202122232425262728293031
<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 파일

12345678910111213141516171819202122232425
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
}
1234567891011121314151617
#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 파일

1234567891011
import co.ab180.airbridge.flutter.AirbridgeFlutter
...
override fun onResume() {
    super.onResume()
    AirbridgeFlutter.trackDeeplink(intent)
}
...
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
}
12345678910111213
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 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

12345
import 'package:airbridge_flutter_sdk/airbridge_flutter_sdk.dart';
...
Airbridge.setOnDeeplinkReceived((url) {
    // show proper content using url
});

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 플러터 SDK 가이드를 참고해주세요.

12345678910111213141516
// StandardCategory
// or "CustomEvent" (CustomCategory)
Airbridge.trackEvent(
    category: AirbridgeCategory.ORDER_COMPLETED,
    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',
    }
)

전체 내용은 코도바-아이오닉 SDK 문서를 참고해주세요.

SDK 설치하기

에어브릿지 코도바-아이오닉 SDK를 설치합니다.

1
cordova plugin add airbridge-cordova-sdk
1
ionic cordova plugin add airbridge-cordova-sdk

SDK 초기화하기

앱이 열릴 때, SDK를 초기화해주세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

ios/YOUR_PROJECT_NAME/AppDelegate.m 파일

123456
import AirbridgeCordova
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    AirbridgeCordova.initializeSDK(name: "YOUR_APP_NAME", token:"YOUR_APP_SDK_TOKEN")
    ...
}
123456
#import <AirbridgeCordova/AirbridgeCordova.h>
...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [AirbridgeCordova initializeSDKWithName:@"YOUR_APP_NAME" token:@"YOUR_APP_SDK_TOKEN"];
    ...
}

android/app/src/main/java/.../MainApplication.kt 파일

1234567
import co.ab180.airbridge.cordova.AirbridgeCordova
...
override fun onCreate() {
    super.onCreate()
    AirbridgeCordova.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    ...
}
12345678
import co.ab180.airbridge.cordova.AirbridgeCordova;
...
@Override
public void onCreate() {
    super.onCreate();
    AirbridgeCordova.initializeSDK(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
    ...
}

SDK 설정하기

에어브릿지 코도바-아이오닉 SDK를 사용하기 위한 설정값을 입력합니다.

12345678910111213141516171819202122
{
    "sdkEnabled": boolean,
    "logLevel": "debug" | "info" | "warning" | "error" | "fault",
    "autoStartTrackingEnabled": boolean,
    "autoDetermineTrackingAuthorizationTimeoutInSecond": number,
    "trackMetaDeferredAppLinkEnabled": boolean,
    "sessionTimeoutInSecond": number,
    "metaInstallReferrerAppID": string,
    "trackAirbridgeDeeplinkOnlyEnabled": boolean,
    "trackingLinkCustomDomains": [string],
    "hashUserInformationEnabled": boolean,
    "sdkSignatureID": string,
    "sdkSignatureSecret": string,
    "clearEventBufferOnInitializeEnabled": boolean,
    "eventBufferCountLimit": number,
    "eventBufferSizeLimitInGibibyte": number,
    "eventTransmitIntervalInSecond": number,
    "isHandleAirbridgeDeeplinkOnly": boolean,
    "collectTCFDataEnabled": boolean,
    "trackingBlocklist": [string],
    "calculateSKAdNetworkByServerEnabled": boolean
}

1. 코도바-아이오닉 프로젝트 폴더 최상단에 airbridge.json 파일을 생성하고 위와 같이 JSON을 입력합니다.

2. 설정이 필요하지 않은 값은 키값을 생략합니다.

ATT 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

코도바-아이오닉 프로젝트 폴더 최상단에 airbridge.json 파일을 생성하고 설정해주세요.

123
{
    "autoDetermineTrackingAuthorizationTimeoutInSecond": 30
}

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

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.ioapplinks:YOUR_APP_NAME.abr.ge 를 추가합니다.

android/app/src/main/AndroidManifest.xml 파일

AndroidManifest.xml
12345678910111213141516171819202122232425262728293031
<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 파일

12345678910111213141516171819202122232425
import AirbridgeCordova
...
// when app is opened with scheme deeplink
func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
    // track deeplink
    AirbridgeCordova.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
    AirbridgeCordova.trackDeeplink(userActivity: userActivity)

    return true
}
1234567891011121314151617
#import <AirbridgeCordova/AirbridgeCordova.h>
...
// when app is opened with scheme deeplink
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    // track deeplink
    [AirbridgeCordova 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
    [AirbridgeCordova trackDeeplinkWithUserActivity:userActivity];

    return YES;
}

android/app/src/main/java/.../MainActivity.kt 파일

1234567891011
import co.ab180.airbridge.cordova.AirbridgeCordova
...
override fun onResume() {
    super.onResume()
    AirbridgeCordova.trackDeeplink(intent)
}
...
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    setIntent(intent)
}
12345678910111213
import co.ab180.airbridge.cordova.AirbridgeCordova;
...
@Override
protected void onResume() {
    super.onResume();
    AirbridgeCordova.trackDeeplink(getIntent());
}
...
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

setOnDeeplinkReceived 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

12345
import { Airbridge } from 'airbridge-cordova-sdk'
...
Airbridge.setOnDeeplinkReceived(function (url) {
    // show proper content using url
});

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 코도바-아이오닉 SDK 가이드를 참고해주세요.

123456789101112
// 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를 설치합니다.

12
npm install --save airbridge-expo-sdk
npm install --save airbridge-react-native-sdk

SDK 초기화하기

앱에서 사용하는 생명주기에 따라 앱이 열릴 때, SDK를 초기화하세요.

YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

app.json
123456789101112131415
{
  "expo": {
    ...
    "plugins": [
      ...
      [
        "airbridge-expo-sdk",
        {
          "appName": "APP_NAME",
          "appToken": "APP_TOKEN"
        }
      ]
    ]
  }
}

SDK 설정하기

에어브릿지 엑스포 SDK를 사용하기 위한 설정값을 입력합니다.

12345678910111213141516171819202122
{
    "sdkEnabled": boolean,
    "logLevel": "debug" | "info" | "warning" | "error" | "fault",
    "autoStartTrackingEnabled": boolean,
    "autoDetermineTrackingAuthorizationTimeoutInSecond": number,
    "trackMetaDeferredAppLinkEnabled": boolean,
    "sessionTimeoutInSecond": number,
    "metaInstallReferrerAppID": string,
    "trackAirbridgeDeeplinkOnlyEnabled": boolean,
    "trackingLinkCustomDomains": [string],
    "hashUserInformationEnabled": boolean,
    "sdkSignatureID": string,
    "sdkSignatureSecret": string,
    "clearEventBufferOnInitializeEnabled": boolean,
    "eventBufferCountLimit": number,
    "eventBufferSizeLimitInGibibyte": number,
    "eventTransmitIntervalInSecond": number,
    "isHandleAirbridgeDeeplinkOnly": boolean,
    "collectTCFDataEnabled": boolean,
    "trackingBlocklist": [string],
    "calculateSKAdNetworkByServerEnabled": 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 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

엑스포 프로젝트 폴더 최상단에 airbridge.json 파일을 생성하고 설정해주세요.

123
{
    "autoDetermineTrackingAuthorizationTimeoutInSecond": 30
}

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다. YOUR_APP_NAMEYOUR_APP_SDK_TOKEN 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

app.json
12345678910111213141516171819202122232425262728293031323334353637
{
  "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"
      ]
    }
  }
}

딥링크로 유저를 이동시키기

setOnDeeplinkReceived 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

12345
import { Airbridge } from 'airbridge-react-native-sdk'
...
Airbridge.setOnDeeplinkReceived((url) => {
    // show proper content using url
})

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

trackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 엑스포 SDK 가이드를 참고해주세요.

1234567891011121314
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를 설치합니다.

1. 최신 버전의 에어브릿지 유니티 SDK를 다운로드 받아주세요.

2. 유니티 상단의 Assets > Import Package > Custom Package ... 를 클릭하여 패키지를 추가해 주세요.

3. 설치가 완료되면 유니티 상단에 Airbridge 탭이 표시됩니다.

SDK 초기화하기

SDK 설정하기App Name, App Token 에 올바른 값을 입력해 주세요.

App Name, App Token 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

SDK 설정하기

에어브릿지 유니티 SDK를 사용하기 위한 설정값을 입력합니다.

1. 유니티 상단의 Airbridge > Airbridge Settings 를 클릭하면 표시되는 위와 같은 화면에 입력합니다.

2. 설정이 필요하지 않은 값은 입력하지 않습니다.

백업룰 설정하기

커스텀 메인 매니페스트 (Assets/Plugins/Android/AndroidManifest.xml) 파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.

  • <manifest> 태그에 tools 네임스페이스를 추가해주세요.

  • <application> 태그에 android:allowBackup 이 있으면 tools:replace 에 값을 추가해주세요.

  • <application> 태그에 android:dataExtractionRules 이 있으면 tools:replace 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

  • <application> 태그에 android:fullBackupContent 이 있으면 tools:replace 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

SDK 설정하기iOS Tracking Authorize Timeout Seconds 에 설정해주세요.

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다.

SDK 설정하기iOS URI SchemeAndroid URI SchemeYOUR_SCHEME 을 입력합니다.

딥링크로 유저를 이동시키기

앱이 딥링크로 열릴 때, trackDeeplink 함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요.

SetOnDeeplinkReceived 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

1234
Airbridge.SetOnDeeplinkReceived((string deeplink) =>
{
    // show proper content using url
});

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

TrackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 유니티 SDK 가이드를 참고해주세요.

123456789101112131415161718
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" }
    }
);

전체 내용은 언리얼 SDK 문서를 참고해주세요.

SDK 설치하기

에어브릿지 언리얼 SDK를 설치합니다.

1. 최신 버전의 Airbridge 언리얼 SDK를 다운로드 받아주세요.

2. 언리얼 엔진 프로젝트의 루트 디렉터리에 Plugins폴더를 생성해주세요.

3. 에어브릿지 언리얼 SDK 를 아래 구조와 같이 Plugins 폴더 내부로 이동시켜주세요.

SDK 초기화하기

SDK 설정하기App Name, App Token 에 올바른 값을 입력해 주세요.

App Name, App Token 은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

SDK 설정하기

에어브릿지 언리얼 SDK를 사용하기 위한 설정값을 입력합니다.

1. 언리얼 엔진의 Project Settings 창을 열고 Plugins 항목 아래에서 Airbridge Unreal SDK 를 클릭하면 표시되는 위와 같은 화면에 입력합니다.

2. 설정이 필요하지 않은 값은 입력하지 않습니다.

3. 필요한 값을 입력한 뒤, Set as Default 버튼을 누릅니다.

백업룰 설정하기

커스텀 메인 매니페스트 (Assets/Plugins/Android/AndroidManifest.xml) 파일의 각 태그의 내용에 따라 선택적으로 백업룰을 설정해주세요.

  • <manifest> 태그에 tools 네임스페이스를 추가해주세요.

  • <application> 태그에 android:allowBackup 이 있으면 tools:replace 에 값을 추가해주세요.

  • <application> 태그에 android:dataExtractionRules 이 있으면 tools:replace 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

  • <application> 태그에 android:fullBackupContent 이 있으면 tools:replace 에 값을 추가하고 파일에 아래의 규칙을 추가해주세요.

AndroidManifest.xml
12345678910
<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"
        ...>
123456789101112131415161718192021
<?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>
12345678910
<?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 프롬프트 제공하기

ATT 프롬프트애플 가이드에 따라 원하는 시점에 표시해주세요.

SDK는 사용자가 ATT 프롬프트에서 동의여부를 결정할때까지 설치이벤트 수집 및 디퍼드 딥링크 전달을 지연시킵니다. 이에 대한 타임아웃을 설정해주세요. (기본적으로 30초이고 최대 1시간까지 설정할 수 있습니다. ATT 프롬프트를 사용하지 않는다면 0초로 설정해주세요.)

SDK 설정하기iOS Tracking Authorize Timeout Seconds 에 설정해주세요.

딥링크 설정하기

딥링크를 설정합니다. 아래 3가지 설정을 모두 완료하세요.

딥링크로 앱이 실행되도록 설정하기

앱에 에어브릿지 딥링크 3개를 설정해주세요. 에어브릿지는 트래킹 링크가 작동할 때 브라우저, 설치 여부 등에 따라 이 중 가장 적합한 딥링크로 앱을 실행합니다.

YOUR_SCHEME 은 에어브릿지 대시보드의 [트래킹링크]>[딥링크]에서 확인한 값을 :// 없이 사용합니다.

SDK 설정하기iOS URI SchemeAndroid URI SchemeYOUR_SCHEME 을 입력합니다.

딥링크로 유저를 이동시키기

앱이 딥링크로 열릴 때, trackDeeplink 함수를 호출해 SDK가 딥링크 이벤트를 수집할 수 있게 해주세요.

SetOnDeeplinkReceived 함수를 호출해 에어브릿지 딥링크를 원래 트래킹링크에 설정된 딥링크로 변환해 전달받아주세요. 그리고 유저를 적절한 화면으로 이동시켜주세요.

1234
FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
{
    // show proper content using url
});

디퍼드 딥링크로 유저를 이동시키기

디퍼드 딥링크는 자동으로 OnDeeplinkReceived 에 전달되기 때문에 별도의 설정이 필요하지 않습니다.

이벤트 전송하기

TrackEvent 함수를 호출해 이벤트를 전송해주세요. 되도록 에어브릿지가 제공하는 스탠다드 카테고리와 시맨틱 어트리뷰트를 사용하시는 것을 권장합니다. 또는 커스텀 카테고리와 커스텀 어트리뷰트를 직접 정의해 사용할 수 있습니다. 자세한 내용은 언리얼 SDK 가이드를 참고해주세요.

1234567891011121314
FAirbridge::TrackEvent(
    // StandardCategory
    // or "CustomEvent" (CustomCategory)
    AirbridgeCategory::ORDER_COMPLETED,
    // SemanticAttributes
    UAirbridgeMap::CreateObject()
        ->Set(AirbridgeAttribute::VALUE, 11)
        ->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
        ->Set(AirbridgeAttribute::CURRENCY, "USD")
        ->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
    // CustomAttributes
    UAirbridgeMap::CreateObject()
        ->Set("key", "value")
);

테스트하기

아래 테스트를 완료하세요.

앱 설치 이벤트 수집 여부 확인하기

  1. 에어브릿지 대시보드 [설정]>[테스트 콘솔]>[앱 설치 이벤트]로 이동합니다.

  2. 테스트 디바이스의 ADID(GAID 또는 IDFA)를 입력합니다.

  3. 테스트 디바이스에서 앱을 삭제하고 QR 코드를 스캔합니다.

  4. 테스트 결과를 확인합니다.

  5. 테스트를 통과하지 않는다면 [SDK 설정하기]>[SDK 초기화하기]를 제대로 진행했는지 확인합니다.

딥링킹 정상 작동 여부 확인하기

  1. 에어브릿지 대시보드 [설정]>[테스트 콘솔]>[딥링킹]으로 이동합니다.

  2. 테스트할 앱의 딥링크를 입력합니다. (예: scheme://product/12345)

  3. 각 [설정 확인]을 클릭하여 대시보드 안내에 따라 테스트 디바이스로 QR 코드를 스캔합니다.

  4. 테스트 결과를 확인합니다.

  5. 테스트를 통과하지 않는다면 [대시보드 설정하기]와 [SDK 설정하기]>[딥링크 설정하기]를 제대로 진행했는지 확인합니다.