Android SDK v2.6.2

SDK 설치


DownloadDownload

패키지 설치

Gradle 설치

project/build.gradle 파일의 allprojects/repositories 블럭 안에 다음과 같은 라인을 추가해 주세요.

allprojects{
    ...
    repositories {
        ...
        maven { url "https://dl.bintray.com/ab180/airbridge" }
        ...
    }
    ...
}

app/build.gradle 파일의 dependencies 블럭 안에 다음과 같은 라인을 추가해 주세요.

dependencies {
    ...
    implementation "io.airbridge:sdk-android:2.6.2"
    ...
}

직접 설치

Airbridge SDK에서는 더 나은 안정성과 생산성을 위해 JetBrains의 Kotlin과 Coroutines 라이브러리를 함께 사용하고 있습니다.

.aar을 통한 직접 설치 시 아래의 링크를 통해 dependency 라이브러리를 함께 프로젝트에 포함시켜 주세요.

라이브러리

링크

Airbridge SDK

다운로드

JetBrains Java Annotations

다운로드

Kotlin Standard Library

다운로드

Kotlinx Coroutines Core

다운로드

Kotlinx Coroutines Android

다운로드

프로젝트 설정

권한 추가

AndroidManifest.xml 파일에 아래와 같이 권한을 추가해 주시기 바랍니다.

<manifest ...>
  ...
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  ...
</manifest>

초기화

AndroidManifest.xml에서 등록한 Application 클래스 파일에 다음과 같은 코드를 추가해 주세요.

@Override
public void onCreate() {
    super.onCreate();
    AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        .build();
    Airbridge.init(this, config);
}
override fun onCreate() {
    super.onCreate()
    val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        .build()
    Airbridge.init(this, config)
}

🚧

올바른 올바른 동작을 위하여 반드시 Application 클래스의 onCreate 시점에 init 함수가 호출 될 수 있도록 작성해 주세요.

해당 YOUR_APP_NAMEYOUR_APP_SDK_TOKEN은 Airbridge 대시보드 → SettingsTokens 탭에서 확인하실 수 있습니다.

SDK 설치 확인

Airbridge SDK의 기본 설치 및 설정이 완료 후 다음과 같은 방법들을 통해서 올바르게 설정 되었는지 확인하실 수 있습니다.

  • 대시보드에서 확인
  1. 해당 테스트를 원하는 디바이스에 앱을 설치하여 실행해 주세요.
  2. Airbridge 대시보드 → Raw DataApp Real-time Logs로 들어가주세요.
  3. 검색창에 해당 기기의 Google Advertising ID를 입력해 주세요.

📘

검색창에 입력한 Google Advertising ID를 가진 Install(Event Category 컬럼)인 이벤트가 확인되지 않는다면 위의 가이드에 안내된 대로 설치되었는지 다시 확인해 주세요.

📘

Android 디바이스에서 설정Google 설정광고내 광고 ID 확인 항목에서 해당 기기의 Google Advertising ID를 확인할 수 있습니다.

  • 로그캣(LogCat) 확인

해당 앱의 자세한 로그 정보를 로그캣(LogCat)에서 확인하고 싶으신 경우 다음과 같은 방법을 통하여 확인하실 수 있습니다.

🚧

해당 사용자의 정보가 노출될 수 있기 때문에 해당 옵션은 Build.DEBUG 인 경우에만 동작 할 수 있도록 처리해 주세요.

// Default log level = Log.INFO
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setLogLevel(Log.DEBUG)
    .build();
Airbridge.init(this, config);
// Default log level = Log.INFO
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setLogLevel(Log.DEBUG)
    .build()
Airbridge.init(this, config)

딥링크 설정


대시보드 설정

대시보드에 다음과 같은 2가지 정보를 등록해야 합니다.

  • URI Scheme
  • sha256_cert_fingerprints

Scheme 등록

사용할 URL Scheme을 상단의 사진과 같이 Android URL Scheme 영역에 ://를 포함하여 다음과 같이 입력해 주세요.

YOUR_APP_URI_SCHEME://

Fingerprint 등록

sha256_cert_fingerprints를 취득하는 방법은 아래와 같습니다.

  1. Google Play Store에 앱을 등록할 때 사용한 keystore 파일을 준비해 주세요.
  2. 다음 명령을 Terminal에서 실행해 주세요.
keytool -list -v -keystore my-release-key.keystore
  1. 하단과 같이 Certificate fingerprints 영역의 SHA256 값을 복사해, 상단의 사진과 같이 Android sha256_cert_fingerprints 영역에 입력해 주세요.
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

프로젝트 설정

Intent Filter 설정

하단에 명시된 절차에 따라서 Intent Filter를 설정해 주세요.

  1. AndroidManifest.xml 파일을 열어주세요.
  2. 딥링크를 처리할 AcitivtyIntent Filter를 다음과 같이 추가해 주세요.
<activity ...>
    ...
    <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" />

        <data android:scheme="http" android:host="YOUR_APP_NAME.deeplink.page" />
        <data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
    </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" />

        <data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
        <data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="YOUR_APP_URI_SCHEME" />
    </intent-filter>
    ...
</activity>
  • YOUR_APP_NAME.deeplink.page : Airbridge App Links 버전 2
  • YOUR_APP_NAME.airbridge.io : Airbridge App Links 버전 1
  • YOUR_APP_URI_SCHEME : URI Scheme 방식의 딥링크

커스텀 도메인 설정

Airbridge 대시보드에서 트래킹 링크를 생성하게 되는 경우 deeplink.page 혹은 abr.ge 형태의 트래킹 링크를 사용할 수 있지만, 고객사에서는 트래킹 링크의 브랜딩 및 클릭률(CTR)의 향상을 위해 다음과 같은 설정을 통해 go.my_company.com/abcd와 같이 커스터마이즈 된 URL을 트래킹 링크로 사용할 수 있습니다.

  1. 사용할 커스텀 도메인을 다음 가이드와 같이 설정해 주세요.
  2. 앞서 설정한 커스텀 도메인 주소를 res/values/airbridge.xml 파일을 생성해 다음과 같이 추가해 주세요.
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
    <string-array name="co_ab180_airbridge_custom_domains">
        <item>YOUR_CUSTOM_DOMAIN</item>
    </string-array>
</resources>
  1. 앞서 설정한 Intent Filter와 같이 딥링크를 처리할 AcitivtyIntent Filter를 다음과 같이 추가해 주세요.
<activity ...>
    ...
    <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" />

        <data android:scheme="http" android:host="YOUR_CUSTOM_DOMAIN" />
        <data android:scheme="https" android:host="YOUR_CUSTOM_DOMAIN" />
    </intent-filter>
    ...
</activity>

❗️

상단에 추가된 YOUR_CUSTOM_DOMAIN은 Airbridge 대시보드에 기입된 정보와 일치해야 합니다.

딥링크 콜백 설정

앞서 설정한 Activity에서 추가된 Intent Filter의 딥링크를 처리하기 위해서 다음과 같은 작업이 필요합니다.

@Override
protected void onResume() {
    super.onResume();
    Airbridge.getDeeplink(getIntent(), new AirbridgeCallback<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            // Process deeplink data
        }

        @Override
        public void onFailure(Throwable throwable) {
            // Error
        }

        @Override
        public void onComplete() {
            // After process deeplink data
        }
    });
}

// The code below is required for proper deeplink processing
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
override fun onResume() {
    super.onResume()
    Airbridge.getDeeplink(intent, object : AirbridgeCallback<Uri> {
        override fun onSuccess(uri: Uri) {
            // Process deeplink data
        }

        override fun onFailure(throwable: Throwable) {
            // Error
        }

        override fun onComplete() {
            // After process deeplink data
        }
    })
}

// The code below is required for proper deeplink processing
override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    setIntent(intent)
}

디퍼드 딥링크 설정

Airbridge SDK에서 디퍼드 딥링크가 발생하는 일반적인 경우 AndroidManiest.xml에 설정된 Intent Filter에 따라 자동으로 해당 Activity가 호출되며 앞서 설명한 딥링크 콜백 설정과 동일한 방법을 통해 일괄적으로 처리할 수 있습니다.

📘

Airbirdge의 디퍼드 딥링크를 통하여 해당 Activity가 호출된 경우, deferred=true 쿼리 파라미터가 포함되어 전달되어 집니다.

디퍼드 딥링크를 통해 얻어진 정보를 이용하여 특수한 작업을 처리하거나 혹은 디퍼드 딥링크를 통해 자동으로 Activity가 호출되는 것을 원치 않는 경우 다음과 같은 방법을 통하여 설정이 가능합니다.

AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setOnDeferredDeeplinkReceiveListener(new OnDeferredDeeplinkReceiveListener() {
        @Override
        public boolean shouldLaunchReceivedDeferredDeeplink(Uri uri) {
            // If you want to open the target activity, please return true otherwise false
            // Default returning value = true
            return true;
        }
    })
    .build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setOnDeferredDeeplinkReceiveListener(object : OnDeferredDeeplinkReceiveListener {
        override fun shouldLaunchReceivedDeferredDeeplink(uri: Uri): Boolean {
            // If you want to open the target activity, please return true otherwise false
            // Default returning value = true
            return true
        }
    })
    .build()
Airbridge.init(this, config)

딥링크 설정 확인

Airbridge SDK의 딥링크 설정이 완료 후 다음과 같은 링크들을 통하여 해당 모바일 앱의 페이지로 올바르게 이동 되는지 확인하실 수 있습니다.

  • YOUR_APP_URI_SCHEME://

딥링크 설정 및 확인이 완료되면 Airbridge 대시보드 → Row DataApp Real-time Log 탭에서 다음과 같이 확인하실 수 있습니다.

사용자 설정


사용자 식별자 설정

Airbridge에서는 웹(Web)과 앱(App)간의 파편화된 사용자의 기여도 측정을 위해 다음과 같은 사용자의 식별자 정보들을 수집합니다.

  • User Email : 이메일
  • User Phone : 전화번호
  • User ID : 사용자 고유 ID (사용자의 특정할 수 있는 ID 값으로 웹과 앱에서 1:1로 대응되어야 합니다)
  • User Alias : 사용자를 나타낼 수 있는 기타 ID (e.g. 로열티 프로그램용 ID, 계열사 통합 ID 등등)

📘

입력되어진 사용자의 이메일과 전화번호는 자동으로 해시화(SHA256)되어 서버로 전송되어 집니다.

Airbridge SDK에서는 다음과 같은 방법을 통해 사용자의 식별자 정보를 설정할 수 있습니다.

// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.getCurrentUser().setEmail("[email protected]");
Airbridge.getCurrentUser().setPhone("821012341234");

// Does not hash 
Airbridge.getCurrentUser().setId("testID");
Airbridge.getCurrentUser().setAlias("key", "value");
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.getCurrentUser().setEmail("[email protected]")
Airbridge.getCurrentUser().setPhone("821012341234")

// Does not hash 
Airbridge.getCurrentUser().setId("testID")
Airbridge.getCurrentUser().setAlias("key", "value")
  • User Alias의 개수는 최대 10개 입니다.
  • User Alias의 key 는 String 타입이며, 길이는 최대 128자 입니다.
  • User Alias의 key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.
  • User Alias의 value 는 String 타입이며 String의 경우 최대 1024자 입니다.

사용자의 식별자 정보를 한번 설정하게 되면 모든 이벤트에 해당 식별자 정보가 함께 포함되어 전달됩니다.

🚧

설정된 사용자의 식별자 정보는 사용자 이벤트에 의해 자동으로 사라지거나 변경될 수 있습니다.

사용자 속성 설정

MTA(Multi-Touch Attribution) 분석의 정확도 향상, 내부 데이터 분석, 서드파티(3rd Party) 솔루션 연동 등의 목적으로 사용자의 추가 속성 데이터를 설정할 수 있습니다.

Airbridge.getCurrentUser().setAttribute("key", "value");
Airbridge.getCurrentUser().setAttribute("key", "value")
  • User Attribute의 개수는 최대 100개 입니다.
  • User Attribute의 key 는 String 타입이며, 길이는 최대 128자 입니다.
  • User Attribute의 key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.
  • User Attribute의 value 는 Integer, Float, Long, Boolean 타입String 타입이며 String의 경우 최대 1024자 입니다.

🚧

설정된 사용자의 속성 정보는 사용자 이벤트에 의해 자동으로 사라지거나 변경될 수 있습니다.

사용자 설정 확인

Airbridge SDK에서 설정한 유저 정보는 Airbridge 대시보드 → Row DataApp Real-time Log 탭에서 다음과 같이 확인하실 수 있습니다.

이벤트 설정


Airbridge SDK에서 호출하는 모든 이벤트들은 다음과 같이 6개의 하위 속성 값들과 함께 전송할 수 있습니다.

  • Event Category : 이벤트의 이름 Required (String)

  • Event Action : 이벤트 하위 속성값 1 (String)

  • Event Label : 이벤트 하위 속성값 2 (String)

  • Event Value : 이벤트 하위 속성값 3 (Float)

  • Event Custom Attributes : 이벤트 하위의 커스텀 데이터 (Map<String, Object>)

  • Event Semantic Attributes : 이벤트 하위의 시멘틱 데이터 (Semantic Attributes Class)

❗️

Airbridge SDK v2.0.0 ~ 2.4.0 에서 존재하던 Event Custom Attributes의 제약 사항이 v2.5.0 부터 사라지게 됩니다.

Deprecated by Airbridge Android SDK v2.5.0

  • Event Attribute의 key 는 String 타입 입니다.
  • Event Attribute의 value 는 Primitive 타입String 타입이며 1 차원의 Array 혹은 List까지 허용합니다. (해당 타입 이 외의 데이터들은 자동으로 무시됩니다)

사용자 이벤트 전송

Airbridge SDK에서는 편의를 위해 다음과 같은 3가지 유저 이벤트를 제공하고 있습니다.

  • 회원가입 (Sign up)
Map<String, String> alias = new HashMap<String, String>()
// userAttributes : User Attribute (NOT Event Attribute)
Map<String, Object> userAttributes = new HashMap<String, Object>()
SignUpEvent event = new SignUpEvent("id", "email", "phone", alias, userAttributes)
Airbridge.trackEvent(event);
val alias = mutableMapOf<String, String>()
// userAttributes : User Attribute (NOT Event Attribute)
val userAttributes = mutableMapOf<String, Any>()
val event = SignUpEvent("id", "email", "phone", alias, userAttributes)
Airbridge.trackEvent(event)

🚧

회원가입(Sign up) 시 전달된 사용자 식별자 정보 및 속성 값는 자동으로 기록되어지게 됩니다.

  • 로그인 (Sign in)
Map<String, String> alias = new HashMap<String, String>()
// userAttributes : User Attribute (NOT Event Attribute)
Map<String, Object> userAttributes = new HashMap<String, Object>()
SignUpEvent event = new SignInEvent("id", "email", "phone", alias, userAttributes)
Airbridge.trackEvent(event);
val alias = mutableMapOf<String, String>()
// userAttributes : User Attribute (NOT Event Attribute)
val userAttributes = mutableMapOf<String, Any>()
val event = SignInEvent("id", "email", "phone", alias, userAttributes)
Airbridge.trackEvent(event)

🚧

로그인(Sign in) 시 전달된 사용자 식별자 정보 및 속성 값는 자동으로 기록되어지게 됩니다.

  • 로그아웃(Sign out)
SignOutEvent event = new SignOutEvent();
Airbridge.trackEvent(event);
val event = SignOutEvent()
Airbridge.trackEvent(event)

🚧

로그아웃(Sign out) 시 기록되었던 모든 사용자 식별자 정보 및 속성 값은 사라지게 됩니다.

이커머스 이벤트 전송

Airbridge SDK에서는 편의를 위해 다음과 같은 상품 클래스와 함께 이커머스 이벤트를 제공하고 있습니다.

Product product = new Product(
    "Tomato_1", // 상품 ID
    "Red tomato", // 상품명
    "Usd", // 통화 (Currency)
    5.99f, // 가격
    1, // 수량
    0 // Index
);
val product = Product(
    "Tomato_1", // 상품 ID
    "Red tomato", // 상품명
    "Usd", // 통화 (Currency)
    5.99f, // 가격
    1, // 수량
    0 // Index
)
  • 홈 화면 (Home Screen)
HomeViewEvent event = new HomeViewEvent();
Airbridge.trackEvent(event);
val event = HomeViewEvent()
Airbridge.trackEvent(event)
  • 검색 결과 조회 (Search Results)
List<Product> products = new ArrayList<Product>();
SearchResultViewEvent event = new SearchResultViewEvent("query", products);
Airbridge.trackEvent(event);
val products = arrayListOf<Product>()
val event = SearchResultViewEvent("query", products)
Airbridge.trackEvent(event)
  • 상품 리스트 조회 (Product List)
List<Product> products = new ArrayList<Product>();
ProductListViewEvent event = new ProductListViewEvent("list_id", products);
Airbridge.trackEvent(event);
val products = arrayListOf<Product>()
val event = ProductListViewEvent("list_id", products)
Airbridge.trackEvent(event)
  • 상품 상세 페이지 조회 (Product Details)
List<Product> products = new ArrayList<Product>();
ProductDetailsViewEvent event = new ProductDetailsViewEvent(products);
Airbridge.trackEvent(event);
val products = arrayListOf<Product>()
val event = ProductDetailsViewEvent(products)
Airbridge.trackEvent(event)
  • 장바구니 담기 (Add to Cart)
List<Product> products = new ArrayList<Product>();
String currency = "usd";
float totalValue = 19.99f;
AddToCartEvent event = new AddToCartEvent("cart_id", products, currency, totalValue);
Airbridge.trackEvent(event);
val products = arrayListOf<Product>()
val currency = "usd"
val totalValue = 19.99f
val event = AddToCartEvent("cart_id", products, currency, totalValue)
Airbridge.trackEvent(event)
  • 결제 완료 (Order Complete)
List<Product> products = new ArrayList<Product>();
boolean inAppPurchased = true;
String currency = "usd";
float totalValue = 19.99f;
OrderCompletedEvent event = new OrderCompletedEvent("transaction_id", products, currency, totalValue, inAppPurchased);
Airbridge.trackEvent(event);
val products = arrayListOf<Product>()
val inAppPurchased = true
val currency = "usd"
val totalValue = 19.99f
val event = OrderCompletedEvent("transaction_id", products, currency, totalValue, inAppPurchased)
Airbridge.trackEvent(event)

커스텀 이벤트 전송

Airbridge SDK에서는 다음과 같은 방법을 통해 커스터마이즈 된 이벤트를 전송할 수 있습니다.

float eventValue = 10f;
Map<String, String> eventAttributes = new HashMap<String, String>();
SemanticAttributes semanticAttributes = new SemanticAttributes();
Airbridge.trackEvent("event_category", "event_action", "event_label", eventValue, eventAttributes, semanticAttributes);
val eventValue = 10f
val eventAttributes = mutableMapOf<String, String>()
val semanticAttributes = SemanticAttributes()
Airbridge.trackEvent("event_category", "event_action", "event_label", eventValue, eventAttributes, semanticAttributes)

혹은 다음과 같이 Airbridge의 이벤트 클래스를 상속받아 각 앱에 맞는 이벤트들을 미리 정의하여 사용할 수도 있습니다.

class MyAppEvent extends Event {
    public MyAppEvent() {
        super("my_custom_category");
    }
}
...
Airbridge.trackEvent(new MyAppEvent());
...

이벤트 전송 확인

Airbridge SDK에서 전송된 이벤트 정보는 Airbridge 대시보드 → Row DataApp Real-time Log 탭에서 다음과 같이 확인하실 수 있습니다.

고급 설정


사용자 정보 해시화 설정

내부의 데이터 분석 등의 목적을 위해 HASH(SHA256)하지 않고 사용자의 식별자 정보를 전송하고 싶은 경우, 다음과 같은 설정을 통해 User Email 그리고 User Phone 정보의 해시화(SHA256)를 중단할 수 있습니다.

❗️

해당 옵션은 User EmailUser Phone 등 민감한 개인정보를 제 3자에게 제공하기 때문에 내부적으로 별도의 보안 조치가 선행되어져야 합니다.

// Default User Info Hash Enabled = true
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setUserInfoHashEnabled(false)
    .build();
Airbridge.init(this, config);
// Default User Info Hash Enabled = true
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setUserInfoHashEnabled(false)
    .build()
Airbridge.init(this, config)

세션 타임아웃 설정

Airbirdge SDK에서는 다음과 같은 처리를 통해 설정된 세션 시간 내에 유저가 앱을 재 실행 하더라도 같은 세션으로 판단하여 앱 실행 이벤트를 다시 보내지 않도록 할 수 있습니다.

// Default Session Timeout = 5 minutes
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setSessionTimeoutSeconds(300)
    .build();
Airbridge.init(this, config);
// Default Session Timeout = 5 minutes
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setSessionTimeoutSeconds(15)
    .build()
Airbridge.init(this, config)

개인정보보호 설정

해당 기능은 GDPR이나 CCPA와 같이 고객으로부터 개인정보보호에 대한 동의를 받아 데이터 수집 및 전송을 진행하는 경우에 유용한 기능입니다.

다음과 같은 방법을 통하여 데이터 수집과 전송을 명시적으로 시작할 수 있습니다.

// Default Auto Start Tracking Enabled = true
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setAutoStartTrackingEnabled(false)
    .build();
Airbridge.init(this, config);

...

// Set a variable like below
if (properties.isGDPRAccepted) {
    Airbridge.startTracking();
}
// Default Auto Start Tracking Enabled = true
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setAutoStartTrackingEnabled(false)
    .build()
Airbridge.init(this, config)

...

// Set a variable like below
if (properties.isGDPRAccepted) {
    Airbridge.startTracking()
}

🚧

Airbridge.startTrackingApplicationonCreate 시점 이후 호출 되는 경우 Install 혹은 Open 이벤트 수집이 무시 될 수 있습니다. 올바른 동작을 위하여 개인 보호 수집 동의 이후에는 ApplicationonCreate 에서 해당 함수를 호출해 주세요.

Airbridge 링크 추적 설정

광고주의 앱 내에서 다수의 딥링크 동작으로 인해 Airbridge를 통한 Re-engagement 성과를 한눈에 확인하기 어려운 경우, 다음과 같은 방법을 통하여 Airbridge 딥링크를 통해 들어온 성과만 필터링하도록 설정할 수 있습니다.

해당 기능을 활성화할 경우 아래의 조건을 만족한 딥링크를 통해 앱이 오픈 된 경우에 한하여 딥링크 성과로 측정합니다.

  • 대시보드에 등록된 형태의 딥링크를 통해 앱이 오픈 된 경우
  • airbridge.io 딥링크를 통해 앱이 오픈 된 경우
  • deeplink.page 딥링크를 통해 앱이 오픈 된 경우
  • airbridge_referrer query 정보가 존재하는 경우
// Default Airbridge Link Only = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackAirbridgeLinkOnly(true)
    .build();
Airbridge.init(this, config);
// Default Airbridge Link Only = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackAirbridgeLinkOnly(true)
    .build()
Airbridge.init(this, config)

위치 정보 수집

Airbridge SDK에서는 다음과 같은 방법을 통하여 유저의 위치 정보를 수집할 수 있습니다.

❗️

위치 정보는 합법적인 목적과 방법을 통하여 수집되어야 하므로 본 기능 사용에 주의가 요구됩니다.

// Choose one
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
...
// Default Location Collection Enabled = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setLocationCollectionEnabled(true)
    .build();
Airbridge.init(this, config);
// Default Location Collection Enabled = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setLocationCollectionEnabled(true)
    .build()
Airbridge.init(this, config)

🚧

Airbridge SDK에서는 LastKnownLocation 정보를 수집하게 됩니다. GPS 정보를 가져오지 않은 상태에서는 해당 권한과 설정이 완료되었더라도 값이 존재하지 않을 수 있습니다.

페이스북 디퍼드 앱링크 설정

Facebook의 Deferred App Link를 간단한 세팅을 통하여 Airbridge SDK에서 함께 받아 보실 수 있습니다.

참조 - https://developers.facebook.com/docs/app-events/getting-started-app-events-android
참조 - https://developers.facebook.com/docs/app-ads/deep-linking

project/build.gradle 파일에 repository를 추가해 주세요.

allprojects{
    ...
    repositories {
        ...
        mavenCentral()
        ...
    }
    ...
}

app/build.gradle 파일의 dependencies 블럭 안에 다음 내용을 추가해 주세요.

dependencies {
    ...
    implementation 'com.facebook.android:facebook-android-sdk:[5,6)'
    ...
}

app/res/values/string.xml 파일에 다음과 같은 string을 추가해 주세요.

...
<string name="facebook_app_id">FACEBOOK_APP_ID</string>
...

AndroidManifest.xml 파일의 <application> 엘리먼트 안에 다음과 같은 <meta-data>를 추가해 주세요

...
<application android:label="@string/app_name" ...> 
    ...
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
    ...
</application>
...

해당 옵션을 아래와 같이 true로 설정해 주세요

// Default Facebook Deferred App Link Enabled = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setFacebookDeferredAppLinkEnabled(true)
    .build();
Airbridge.init(this, config);
// Default Facebook Deferred App Link Enabled = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setFacebookDeferredAppLinkEnabled(true)
    .build()
Airbridge.init(this, config)

앱 삭제 추적 설정

📘

Firebase Messaging을 통한 앱 삭제 추적 설정은 Airbridge SDK v2.6.0 이후 버전 부터 사용 가능합니다.

앱 삭제 추적 설정에 대한 자세한 사항은 해당 페이지를 참조해 주세요.

Braze 연동 설정

Braze를 함께 사용하는 경우 Airbridge SDK에서 간단한 설정으로 Airbridge의 기여 정보를 Braze 대시보드에서 확인하실 수 있습니다.

// Default Braze Integration Enabled = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setBrazeIntegrationEnabled(true)
    .build();
Airbridge.init(this, config);
// Default Braze Integration Enabled = false
val config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setBrazeIntegrationEnabled(true)
    .build()
Airbridge.init(this, config)

하이브리드 앱 설정


Web SDK만의 설치로는 앱 설치 및 실행 또는 딥링크 호출 등의 추가적인 이벤트를 트래킹 할 수가 없습니다. Airbridge에서는 다음과 같은 설정을 통하여 쉽게 하이브리드 앱에서 인앱 이벤트를 호출할 수 있습니다.

❗️

하이브리드 앱 연동을 위해서는 반드시 Airbridge SDK의 설치 및 설정이 미리 선행되어야 합니다.

웹뷰 환경 이벤트 전송

참조 - Building web apps in WebView

참조 - Understanding Android webview javascript interface

대상 Web View에 다음과 같이 Airbridge::setJavascriptInterface 함수를 호출해 주세요.

public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWebView();
    }
    
    void initWebView(DeviceInfo deviceInfo) {
        webView = findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);

        Airbridge.setJavascriptInterface(webView, "YOUR_WEB_SDK_TOKEN");    
    
        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new WebViewClient());
        webView.loadUrl("http://dev.blog.airbridge.io/websdk-web-app/");
    }
}
class MainActivity : Activity() {
    
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initWebView()
    }
    
    void initWebView(DeviceInfo deviceInfo) {
        webView.getSettings().setJavaScriptEnabled(true)
        webView.getSettings().setDomStorageEnabled(true)
        
        Airbridge.setJavascriptInterface(webView, "YOUR_WEB_TOKEN")

        webView.setWebChromeClient(new WebChromeClient())
        webView.setWebViewClient(new WebViewClient())
        webView.loadUrl("http://my_company.com/main")
    }
}

해당 YOUR_WEB_SDK_TOKEN은 Airbridge 대시보드 → SettingsTokens 탭에서 확인하실 수 있습니다.

해당 설정이 완료 되면 실제 사용할 웹 페이지에서 다음과 같이 Web SDK를 초기화해 주세요.

(function(a_,i_,r_,_b,_r,_i,_d,_g,_e){if(!a_[_b]||!a_[_b].queue){_g=i_.getElementsByTagName(r_)[0];a_[_b]={queue:[]};_d={};for(_i=0;_i<_r.length;_d={$jscomp$loop$prop$m$2:_d.$jscomp$loop$prop$m$2},_i++)_d.$jscomp$loop$prop$m$2=_r[_i],~_d.$jscomp$loop$prop$m$2.indexOf(".")&&(_e=_d.$jscomp$loop$prop$m$2.split(".")[0],a_[_b][_e]=a_[_b][_e]||{},a_[_b][_e][_d.$jscomp$loop$prop$m$2.split(".")[1]]=function(_d){return function(){a_[_b].queue.push([_d.$jscomp$loop$prop$m$2,arguments])}}(_d)),a_[_b][_d.$jscomp$loop$prop$m$2]=function(_d){return function(){a_[_b].queue.push([_d.$jscomp$loop$prop$m$2,arguments])}}(_d);_d=i_.createElement(r_);_d.async=1;_d.src="//static.airbridge.io/sdk/latest/airbridge.min.js";_g.parentNode.insertBefore(_d,_g)}})(window,document,"script","airbridge","init setBanner setDownload setDeeplinks sendSMS sendWeb setUserAgent setUserAlias addUserAlias setMobileAppData setUserId setUserEmail setUserPhone setUserAttributes setDeviceIFV setDeviceIFA setDeviceGAID events.send events.signIn events.signUp events.signOut events.purchased events.addedToCart events.productDetailsViewEvent events.homeViewEvent events.productListViewEvent events.searchResultViewEvent".split(" "));

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

Troubleshooting


Auto Backup

참조 - https://developer.android.com/guide/topics/data/autobackup

안드로이드 앱에서 Auto Backup이 필요로 하는 경우 Auto Backup Rules의 정의가 필요할 수 있습니다. 이 같은 경우에 Airbridge SDK에서는 내부 데이터의 자동 복제를 방지하기 위하여 별도의 airbridge_auto_backup_rules.xmlAndroidManifest.xml에 정의하고 있어 빌드 시 Manifest merger failed : Attribute [email protected] value=(true)과 같은 충돌이 발생할 수 있습니다.

다음과 같은 충돌이 발생한 경우 tools:replace="android:fullBackupContent"의 설정과 해당 커스터마이즈 된 auto backup rule 파일에 추가적인 Merging 작업을 필요로 합니다.

Airbridge SDK에서 정의하는 Auto Backup 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>