Android SDK v1.8.0

설치

1. build.gradle

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

dependencies {
    ...
    implementation 'io.airbridge:sdk-android:1.8.0'
    implementation 'com.android.installreferrer:installreferrer:1.1'
    ...
}

Gradle 또는 인터넷을 사용할 수 없는 환경인 경우, 고급 - SDK 직접 설치 를 확인해 주세요.

2. AndroidManifest.xml

app/src/main/AndroidManifest.xml 파일에 아래와 같은 권한을 추가해 주세요.

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

3. Proguard

Proguard를 사용중이시라면,
app/proguard-rules.pro 파일에 다음 내용을 추가해 주세요.

-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {public *;}
-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info { public *;}
-keep class com.android.installreferrer.api.InstallReferrerClient {public *;}
-keep class com.android.installreferrer.api.InstallReferrerClient$newBuilder { public *;}
-keep class com.android.installreferrer.api.InstallReferrerClient$Builder { public *;}
-keep class com.android.installreferrer.api.ReferrerDetails {public *;}
-keep class com.android.installreferrer.api.InstallReferrerStateListener {public *;}
-keep class io.airbridge.deviceinfo.** { *; }
-keepclassmembers class io.airbridge.** { public *; }
-keep public class io.airbridge.**

4. MainApplication.java

app/src/main/java/.../MainApplication.java 파일의 import 부분에 아래와 같은 코드를 추가해주세요.

import io.airbridge.*;

app/src/main/java/.../MainApplication.java 파일의 onCreate 함수에 아래와 같은 코드를 추가해주세요.

@Override
public void onCreate() {
    super.onCreate();
    ...
    AirBridge.init(this, "앱 이름", "앱 토큰");
}
override fun onCreate() {
    super.onCreate()
    ...
    AirBridge.init(this, "앱 이름", "앱 토큰")
}

'앱 이름' 은 대시보드의 'App Setting > 앱 기본정보' 에서 확인할 수 있습니다.
'앱 토큰' 은 대시보드의 'App Setting > 토큰 관리' 에서 확인할 수 있습니다.

설치 - 딥링크 - 등록

딥링크 기능을 사용하기 위해 앱의 정보들을 에어브릿지 대시보드에 등록합니다.

대시보드에 접속하시고 사이드바의 Deeplinks 메뉴를 클릭하면 아래와 같은 화면이 나옵니다.

Scheme

  1. 사용하기 원하는 scheme 를 딥링크 등록 부분 사진의 Android URL scheme 영역에 "://" 을 붙여 입력해주세요.

예) scheme://

Applinks

  1. Google Play Store 에 등록할 때 사용한 signing key 를 준비해주세요.

  2. 다음 명령을 실행해주세요.

keytool -list -v -keystore my-release-key.keystore
  1. Certificate fingerprints 의 SHA256 란을 복사해, 딥링크 등록 부분 사진의 Android sha256_cert_fingerprints 영역에 입력해주세요.

예) 14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5

설치 - 딥링크 - code

AndroidManifest.xml

  1. app/src/main/AndroidManifest.xml 파일을 열어주세요.
  2. 딥링크로 열리는 Acitivty 의 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.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="EXAMPLE_SCHEME" />
</intent-filter>

YOUR_APP_NAME 에 앱 이름을 입력해주세요.

EXAMPLE_SCHEME 부분에 대시보드에서 설정한 scheme 값을 입력해주세요.

Fetch Deeplink

딥링크로 열리는 Acitivty 의 onResume 부분에 다음 코드를 입력해주세요.

@Override
protected void onResume() {
    super.onResume();

    AirBridge.getDeeplink().fetch(getIntent())
            .onSuccess((deeplink) -> {
                // 딥링크가 있으면
                Log.d("deeplink", "success : " + deeplink);
            })
            .onComplete(() -> {
                // 딥링크가 있으면
                // 딥링크가 없으면
                // 에러가 없으면
                Log.d("deeplink", "complete");
            })
            .onError((error) -> {
                // 에러가 발생하면
                Log.d("deeplink", "error : " + error.getMessage());
            });
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    setIntent(intent);
}
override fun onResume() {
    super.onResume()
    
    AirBridge.getDeeplink().fetch(getIntent())
            .onSuccess { deeplink ->
                // 딥링크가 있으면
                Log.d("deeplink", "success : " + deeplink);
            }.onComplete {
                // 딥링크가 있으면
                // 딥링크가 없으면
                // 에러가 없으면
                Log.d("deeplink", "complete");
            }.onError { error ->
                // 에러가 발생하면
                Log.d("deeplink", "error : " + error.getMessage());
            }
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    
    setIntent(intent)
}

딥링크로 앱이 열렸으면 onSuccess 함수가 호출된 다음 onComplete 함수가 호출됩니다.

딥링크 없이 앱이 열렸으면 onComplete 함수만 호출됩니다.

딥링크로 앱이 열렸지만, 딥링크를 가져오는 도중 에러가 발생하면, onError 함수가 호출됩니다.

설치 - 딥링크 - 커스텀 (옵션)

Tracking Link - Custom Domain

트래킹링크 커스텀 도메인을 설정했다면 다음과 같이 설정해주세요.

  1. res/values/airbridge.xml 파일을 생성해주세요.
  2. 다음 값을 추가해주세요.
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="ExtraTranslation" >
    <string-array name="co_ab180_airbridge_trackinglink_customDomains">
        <item>example.com</item>
    </string-array>
</resources>

example.com 부분에 설정한 커스텀 도메인을 넣어주세요.

Deeplink - Custom Domain

onSuccess 에 발생하는 딥링크의 형태를 변경할 수 있습니다.

  1. res/values/airbridge.xml 파일을 생성해주세요.
  2. 다음 값을 추가해주세요.
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="ExtraTranslation" >
    ...
    <string name="co_ab180_airbridge_deeplink_scheme">
        example
    </string>
    <string name="co_ab180_airbridge_deeplink_host">
        example.com
    </string>
</resources>

위와 같이 설정하면, onSuccess

deeplink 가 https://appname.airbridge.io/... 형태로 발생하던 것이

deeplink 가 example://example.com/... 형태로 발생하게 변경됩니다.

Deeplink - Custom DomainTracking Link - Custom Domain 은 서로 동일하면 안됩니다.

설치 확인

  1. 테스트 디바이스에서 앱을 삭제해주세요.
  2. 앱을 빌드하여 해당 테스트 디바이스에서 앱을 설치 및 실행을 해주세요.
  3. 에어브릿지 대시보드 → 앱 선택 → 'Log Data' 아래의 'Realtime Log' 항목을 클릭해 주세요.
  4. 'Device UUID 입력' 에 Android GAID 를 입력해 주세요.
  • 디바이스 UUID (Android GAID) 노출이 확인되지 않는다면 설치 에 안내된 대로 설치되었는지 다시 확인해 주세요.
  • 로그 노출은 최대 5분 가량 지연될 수 있습니다.
  • Android 디바이스에서 '설정' → Google 설정 → 광고 → '내 광고 ID 확인' 항목의 값이 Android GAID 입니다.

인앱 이벤트

사용자의 중요한 행동들이 발생할 때, 인앱 이벤트를 전송해 유입 경로별 성과를 측정할 수 있습니다.

회원, 커머스 관련 9가지의 기본이벤트가 제공되고, 커스텀 이벤트를 정의하여 사용하실 수 있습니다.

모든 이벤트에 첨부되는 모든 정보는 선택적으로 추가할 수 있습니다.

그러나 이벤트에 대한 많은 정보는 정확한 통계 제공에 도움이 됨으로 추가하는 것을 권장합니다.

인앱 이벤트 - 회원

회원 인앱 이벤트는 크로스 플랫폼 사용자 매칭 의 구성요소입니다.

가능하면 하나이상의 유저 정보를 포함하여 전송해 주시기 바랍니다.

회원가입 및 로그인 이벤트가 발생한 경우,

다음 로그아웃 이벤트 발생까지 모든 이벤트가 해당 유저에서 발생한 것으로 기록됩니다.

로그아웃 이벤트가 발생한 경우,

다음 회원가입 및 로그인 이벤트 발생까지 모든 이벤트가 유저 없이 발생한 것으로 기록됩니다.

사용자의 Email 및 Phone 정보는 Hash (SHA256) 되어 전송됩니다.

회원가입

사용자가 회원가입을 하는 경우, SignUpEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

SignUpEvent

비어있는 회원가입 이벤트

매서드

이름

파라미터

설명

setUserId

String userId
회원가입하는 유저의 아이디

유저의 아이디를 설정

setUserEmail

String userEmail
회원가입하는 유저의 이메일

유저의 이메일을 설정

setUserPhone

String userPhone
회원가입하는 유저의 휴대전화 번호

유저의 휴대전화 번호를 설정

코드 예시

SignUpEvent event = new SignUpEvent()
        .setUserId("test-user-id")
        .setUserEmail("[email protected]")
        .setUserPhoneNumber("000-0000-0000");

AirBridge.getTracker().sendEvent(event);
val event = SignUpEvent()
        .setUserId("test-user-id")
        .setUserEmail("[email protected]")
        .setUserPhoneNumber("000-0000-0000");

AirBridge.getTracker().sendEvent(event)

로그인

사용자가 로그인을 하는 경우, SignInEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

SignInEvent

비어있는 로그인 이벤트

매서드

이름

파라미터

설명

setUserId

String userId
회원가입하는 유저의 아이디

유저의 아이디를 설정

setUserEmail

String userEmail
회원가입하는 유저의 이메일

유저의 이메일을 설정

setUserPhone

String userPhone
회원가입하는 유저의 휴대전화 번호

휴대전화 번호를 설정

코드 예시

SignInEvent event = new SignInEvent()
        .setUserId("test-user-id")
        .setUserEmail("[email protected]");
        .setUserPhoneNumber("000-0000-0000");

AirBridge.getTracker().sendEvent(event);
val event = SignInEvent()
        .setUserId("test-user-id")                    
        .setUserEmail("[email protected]")
        .setUserPhoneNumber("000-0000-0000");

AirBridge.getTracker().sendEvent(event)

로그아웃

사용자가 로그아웃을 하는 경우, SignOutEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

SignOutEvent

비어있는 로그아웃 이벤트

코드 예시

SignOutEvent event = new SignOutEvent()

AirBridge.getTracker().sendEvent(event);
val event = SignOutEvent()

AirBridge.getTracker().sendEvent(event)

인앱 이벤트 - 커머스

사용자의 커머스 관련 행동을 추적합니다.

Product 클래스

상품 클래스입니다.

생성자

이름

파라미터

설명

Product

비어 있는 상품

메서드

이름

파라미터

설명

setProductId

String productId
상품의 고유 ID

상품의 고유 ID 설정

setName

String name
상품 이름

상품 이름 설정

setCurrency

String currency
상품 통화

상품 통화 설정
ISO 4217 standard에 따름

setPrice

Integer price
상품 금액

상품 금액 설정

setQuantity

Integer quantity
상품 수량

상품 수량 설정

setPositionInList

Integer positionInList
리스트 중 상품 위치

리스트 중 상품 위치 설정

코드 예시

Product product = new Product();
product.setProductId("product_id_100600");
product.setName("Apple MacBook Pro");
product.setPrice(2160000);
product.setCurrency("KRW");
product.setQuantity(2);
product.setPositionInList(0);
val product = Product()
product.productId = "product_id_100600"
product.name = "Apple MacBook Pro"
product.price = 2160000f
product.currency = "KRW"
product.quantity = 2
product.positionInList = 0

홈 화면 조회

사용자가 앱의 홈 화면으로 이동하는 경우, HomeViewEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

HomeViewEvent

홈 뷰 이벤트

코드 예시

HomeViewEvent event = new HomeViewEvent();
AirBridge.getTracker().sendEvent(event);
val event = HomeViewEvent()
AirBridge.getTracker().sendEvent(event)

상품 리스트 조회

사용자가 상품 리스트를 조회할 경우, ProductListViewEvent를 전송해 주세요.

생성자

이름

파라미터

설명

ProductListViewEvent

비어있는 상품 리스트 조회 이벤트

ProductListViewEvent

상품 리스트 아이디와 상품 리스트가 포함된
상품 리스트 조회 이벤트

상품 리스트 아이디와 상품 리스트가 포함된
상품 리스트 조회 이벤트

ProductListViewEvent

String listId
상품 리스트의 고유 아이디
Product product
상품

리스트 아이디와 단일 상품이 포함된
상품 리스트 조회 이벤트

메서드

이름

파라미터

설명

setListId

String listId
상품 리스트의 고유 아이디

상품 리스트 아이디 설정

addProduct

Product product
상품

상품 리스트에 상품 추가

addProducts

List<Product> products
상품 리스트

상품 리스트에 상품 리스트 추가

코드 예시

// 상품 정보 생성
Product product1 = new Product();
product1.setProductId("product_id_100600");
product1.setName("Apple MacBook Pro");
product1.setPrice(2160000);
product1.setPositionInList(1);

Product product2 = new Product();
product2.setProductId("product_id_100800");
product2.setName("Samsung Notebook5");
product2.setPrice(1420000);
product2.setPositionInList(2);

// 상품 리스트 생성
List<Product> products = Arrays.asList(product1, product2);

// 이벤트 생성
ProductListViewEvent event = new ProductListViewEvent("list_id_200400", products);

// 전송
AirBridge.getTracker().sendEvent(event);
// 상품 정보 생성
val product1 = Product()
product1.productId = "product_id_10600");
product1.name = "Apple MacBook Pro"
product1.price = 2160000f
product1.positionInList = 1

val product2 = Product()
product2.productId = "product_id_100800"
product2.name = "Samsung Notebook5"
product2.price = 1420000f
product2.positionInList = 2

// 상품 리스트 생성
val products = Arrays.asList(product1, product2)

// 이벤트 생성
val event = ProductListViewEvent("list_id_200400", products)

// 전송
AirBridge.getTracker().sendEvent(event)
  • 사용자가 리스트를 스크롤하여 새로운 정보를 로드할 경우
    추가적으로 로드된 상품 정보로 해당 이벤트를 별도로 생성하여 전송하시는 것을 권장합니다.

검색결과 조회

사용자가 상품을 검색하는 경우, SearchResultViewEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

SearchResultViewEvent

비어있는 검색결과 이벤트

SearchResultViewEvent

String query
검색어
List<Product> products
검색 결과 상품 리스트

검색어와 상품 리스트인 검색 결과가 포함된
검색결과 이벤트

SearchResultViewEvent

String query
검색어
Product product
검색 결과 상품

검색어와 단일 상품인 검색 결과가 포함된
검색결과 이벤트

메서드

이름

파라미터

설명

setQuery

String query
검색어

검색어 정보 설정

addProduct

Product
상품

검색 결과인 상품 추가

addProducts

List<Product>
상품 리스트

검색 결과인 상품 리스트 추가

코드 예시

SearchResultViewEvent event = new SearchResultViewEvent ("24inch monitor", products);

AirBridge.getTracker().sendEvent(event);
val event = SearchResultViewEvent("24inch monitor", products)

AirBridge.getTracker().sendEvent(event)

상품 상세페이지 조회

사용자가 상품의 상세정보를 조회하는 경우, ProductDetailsViewEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

ProductDetailsViewEvent

비어있는 상품 상세페이지 조회 이벤트

ProductDetailsViewEvent

List<Product>
상품 리스트

여러 상품에 대한 상품 상세페이지 조회 이벤트

ProductDetailsViewEvent

Product
상품

단일 상품에 대한 상품 상세페이지 조회 이벤트

코드 예시

ProductDetailsViewEvent event = new ProductDetailsViewEvent(product);

AirBridge.getTracker().sendEvent(event);
val event = ProductDetailsViewEvent(products)

AirBridge.getTracker().sendEvent(event)

장바구니 담기

사용자가 장바구니에 상품을 담는 경우, AddedToCartEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

AddedToCartEvent

장바구니 담기 이벤트

AddedToCartEvent

String cartId
장바구니의 고유 아이디
List<Product> products
상품 리스트

장바구니의 고유 아이디와 여러 상품이 포함된
장바구니 담기 이벤트

AddedToCartEvent

String cartId
장바구니의 고유 아이디
Product product
상품

장바구니의 고유 아이디와 단일 상품이 포함된
장바구니 담기 이벤트

메서드

이름

파라미터

설명

setCartId

String cartId
장바구니 고유 아이디

장바구니 고유 아이디 설정

addProduct

Product
상품

장바구니에 추가할 상품 추가

addProducts

List<Product> products
상품 리스트

장바구니에 추가할 상품 리스트 추가

setCurrency

String

장바구니에 추가할 물품들의 총 금액의 통화 설정
ISO 4217 standard에 따름

setTotalValue

Float

장바구니에 추가할 물품들의 총 금액 설정

코드 예시

Product product1 = new Product();
product1.setProductId("product_id_100600");
product1.setName("Apple MacBook Pro");
product1.setPrice(2160000);
product1.setPositionInList(1);

Product product2 = new Product();
product2.setProductId("product_id_100800");
product2.setName("Samsung Notebook5");
product2.setPrice(1420000);
product2.setPositionInList(2);

List<Product> products = Arrays.asList(product1, product2);

AddedToCartEvent event = new AddedToCartEvent()
       .setCartId("cart_id_51243")
       .addProducts(products)
       .setCurrency("KRW")
       .setTotalValue(3580000);

AirBridge.getTracker().sendEvent(event);
val product1 = Product()
product1.productId = "product_id_100600"
product1.name = "Apple MacBook Pro"
product1.price = 2160000f
product1.positionInList = 1

val product2 = Product()
product2.productId = "product_id_100800"
product2.name = "Samsung Notebook5"
product2.price = 1420000f
product2.positionInList = 2

val products = Arrays.asList(product1, product2)

val event = AddedToCartEvent()
        .setCurrency("card_id_51243")
        .addProducts(products)
        .setCurrency("KRW")
        .setTotalValue(3580000f)

AirBridge.getTracker().sendEvent(event)

결제

사용자가 결제하는 경우, PurchaseEvent 를 전송해 주세요.

생성자

이름

파라미터

설명

PurchaseEvent

결제 이벤트

PurchaseEvent

List<Product> products
상품 리스트

여러 상품에 대한 결제 이벤트

PurchaseEvent

Product product
상품

단일 상품에 대한 결제 이벤트

메서드

이름

파라미터

설명

addProduct

Product product
상품

결제한 상품 추가

addProducts

List<Product> product
상품 리스트

결제한 상품 리스트 추가

setInAppPurchase

Boolean isInAppPurchase
인앱 결제 여부

인앱 결제 여부 설정

setTotalValue

Float totalValue
총 결제 금액

총 결제 금액 설정

setTransactionId

String transactionId
결제의 고유 ID

결제의 고유 ID 설정

setCurrency

String currency
결제한 금액의 통화 단위

결제한 금액의 통화 설정
ISO 4217 standard에 따름

코드 예시

Product product1 = new Product();
product1.setProductId("product_id_100600");
product1.setName("Apple MacBook Pro");
product1.setPrice(2160000);
product1.setPositionInList(1);

Product product2 = new Product();
product2.setProductId("product_id_100800");
product2.setName("Samsung Notebook5");
product2.setPrice(1420000);
product2.setPositionInList(2);

List<Product> products = Arrays.asList(product1, product2);

PurchaseEvent event = new PurchaseEvent(products)
        .setTransactionId("transact-purchase-01")
        .setInAppPurchaseed(true)
        .setCurrency("KRW")
        .setTotalValue(3580000);

AirBridge.getTracker().sendEvent(event);
val product1 = Product()
product1.productId = "product_id_100600"
product1.name = "Apple MacBook Pro"
product1.price = 2160000f
product1.positionInList = 1

val product2 = Product()
product2.productId = "product_id_100800"
product2.name = "Samsung Notebook5"
product2.price = 1420000f
product2.positionInList = 2

val products = Arrays.asList(product1, product2)

val event = PurchaseEvent(products)
        .setTransactionId("transact-purchase-01")
        .setInAppPurchaseed(true)
        .setCurrency("KRW")
        .setTotalValue(3580000f)

AirBridge.getTracker().sendEvent(event)

인앱 이벤트 - 커스텀

인앱 이벤트를 커스텀 정의해서 사용할 수 있습니다.

생성자

이름

파라미터

설명

GoalEvent

String category
이벤트 이름

category가 포함되어있는 커스텀 이벤트

메서드

이름

파라미터

설명

setCategory

String

이벤트 이름

setAction

String

이벤트 하위 분류 1

setLabel

String

이벤트 하위 분류 2

setValue

Integer

이벤트 커스텀 값

setCustomAttribute

String, Object

이벤트 커스텀 정보

코드 예시

GoalEvent event = new GoalEvent("category")
        .setAction("action")
        .setLabel("label")
        .setValue(3412)
        .setCustomAttribute("key", "value");

AirBridge.getTracker().sendEvent(event);
val event = GoalEvent("category")
        .setAction("action")
        .setLabel("label")
        .setValue(3412)
        .setCustomAttribute("key", "value")

AirBridge.getTracker().sendEvent(event)

Category, Action, Label에 대해서는 인앱 이벤트 구분 항목을 참고해주세요.

추가 수집

선택적으로 더 많은 정보를 수집할 수 있습니다.

App 에서 딥링크 실행 및 추적

아래와 같은 코드를 사용해서 App 에서 딥링크 동작을 수행하고, 그 동작을 추적할 수 있습니다.

// AirBridge.init() 을 호출하지 않았다면, MainApplication#onCreate 에서 호출
AirBridge.initPlacement();

AirBridge.getPlacement().click("https://abr.ge/~~~", "ablog://main", "https://airbridge.io");
AirBridge.getPlacement().impression("https://abr.ge/~~~");
// AirBridge.init() 을 호출하지 않았다면, MainApplication#onCreate 에서 호출
AirBridge.initPlacement()

AirBridge.getPlacement().click("https://abr.ge/~~~", "ablog://main", "https://airbridge.io")
AirBridge.getPlacement().impression("https://abr.ge/~~~")

AirBridge.init() 을 호출하였다면, AirBridge.initPlacement() 를 호출하지 않아도 됩니다.

AirBridge.init() 을 호출하지 않았다면, AirBridge.initPlacement() 를 호출해 주세요.

click

click 함수는 해당 트래킹링크 의 click 통계를 1개 추가하고 설정된 App, Web 또는 Fallback 으로 이동합니다.

해당 트래킹링크 가 클릭되었을 때, 호출해 주세요.

click 함수에서 deeplink, fallback 은 인터넷 연결이 없을 때 사용하는 백업 링크 입니다.

deeplink 파라미터는 Custom URL Scheme 형식의 딥링크만 사용가능 합니다.
(모두 optional 파라미터 입니다.)

impression

impression 함수는 해당 트래킹링크 의 impression 통계를 1개 추가합니다.

해당 트래킹링크 가 UI 에 표시되었을 때, 호출해 주세요.

커스텀 도메인 을 사용하는 중 이라면, 커스텀 Short ID 를 사용한 트래킹링크 는 사용할 수 없습니다.

example: http://deeplink.ab180.co/custom -> 사용불가

example: http://deeplink.ab180.co/a3b1c2 -> 사용가능

example: https://abr.ge/a3b1c2 -> 사용가능

설치된 앱 리스트

사용자 기기의 앱 리스트를 수집할 수 있습니다.

AirBridge.init 코드 이전에 다음 코드로 설치된 앱 리스트 수집 여부를 설정할 수 있습니다.

AirBridge.setInstalledAppEnable(true); // 설치된 앱 리스트 수집 기능 On

Airbridge.init();
AirBridge.setInstalledAppEnable(false); // 설치된 앱 리스트 수집 기능 Off

Airbridge.init();

에어브릿지 Android SDK 에서 설치된 앱 리스트 수집의 기본값은 false입니다.

유저 통신사 이름 수집

사용자의 통신사 이름을 추가적으로 수집할 수 있습니다.

app/src/main/AndroidManifest.xml 파일에 아래와 같은 권한을 추가해 주세요.

...
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
...

이 설정은 크로스 플랫폼 사용자 매칭 의 정확도를 높여 줍니다.

설정

세션 기간

AirBridge.init 코드 이전에 다음 메서드를 호출해 앱의 세션 기간을 설정할 수 있습니다.

세션 기간은 second 단위이며, 0 이상 604800 (7일) 이하 인 값이어야 합니다.

AirBridge.setCustomSessionTimeOut(300);
Airbridge.init();

세션 기간의 기본값은 300초(5분)입니다.

유저 정보 암호화 해제

유저의 Email, Phone 정보는 Hash (SHA256) 되어 전송합니다.

만일 Hash 화를 원하지 않을 경우 아래 메서드를 활용하여 설정을 변경하실 수 있습니다.

// User 정보 Hash 화 해제
AirBridge.getTracker().setIsUserInfoHashed(false);

// User 정보 Hash 화 적용
Airbridge.getTracker().setIsUserInfoHashed(true);

인앱 이벤트 구분

에어브릿지 대시보드는 Category, Action, Label 을 통해 이벤트들을 분리하여 통계를 표시합니다.

Category 는 이벤트의 이름 입니다.

Action 은 이벤트의 하위 분류 1 입니다.

Label 은 이벤트의 하위 분류 2 입니다.

모든 인앱 이벤트는 Action 과 Label 을 수정할 수 있습니다.

커스텀 인앱 이벤트는 Category 지정이 가능하고 기본제공 인앱 이벤트는 Category 지정이 불가능합니다.

코드 예시

SignUpEvent signUpEvent1 = new SignUpEvent()
        .setAction("서울")
        .setLabel("10대");

SignUpEvent signUpEvent2 = new SignUpEvent()
        .setAction("서울")
        .setLabel("20대");

SignUpEvent signUpEvent3 = new SignUpEvent()
        .setAction("부산")
        .setLabel("10대");

PurchaseEvent purchaseEvent1 = new PurchaseEvent()
        .setAction("간편결제 사용")
        .setLabel("카카오페이 사용");

PurchaseEvent purchaseEvent2 = new PurchaseEvent()
        .setAction("간편결제 사용")
        .setLabel("토스 사용");

GoalEvent subscribeEvent1 = new GoalEvent("구독")
        .setAction("일반");

GoalEvent subscribeEvent2 = new GoalEvent("구독")
        .setAction("프리미엄");

for(int i=0; i<10; i++) {
    AirBridge.getTracker().sendEvent(signUpEvent1);
}

for(int i=0; i<20; i++) {
    AirBridge.getTracker().sendEvent(signUpEvent2);
}

for(int i=0; i<15; i++) {
    AirBridge.getTracker().sendEvent(signUpEvent3);
}

for(int i=0; i<8; i++) {
    AirBridge.getTracker().sendEvent(purchaseEvent1);
}

for(int i=0; i<7; i++) {
    AirBridge.getTracker().sendEvent(purchaseEvent2);
}

for(int i=0; i<10; i++) {
    AirBridge.getTracker().sendEvent(subscribeEvent1);
}

for(int i=0; i<5; i++) {
    AirBridge.getTracker().sendEvent(subscribeEvent2);
}
val signUpEvent1 = new SignUpEvent()
        .setAction("서울")
        .setLabel("10대")

val signUpEvent2 = new SignUpEvent()
        .setAction("서울")
        .setLabel("20대")

val signUpEvent3 = new SignUpEvent()
        .setAction("부산")
        .setLabel("10대")

val purchaseEvent1 = new PurchaseEvent()
        .setAction("간편결제 사용")
        .setLabel("카카오페이 사용")

val purchaseEvent2 = new PurchaseEvent()
        .setAction("간편결제 사용")
        .setLabel("토스 사용")

val subscribeEvent1 = new GoalEvent("구독")
        .setAction("일반")

val subscribeEvent2 = new GoalEvent("구독")
        .setAction("프리미엄")

for(i in 1..10) {
    AirBridge.getTracker().sendEvent(signUpEvent1)
}

for(i in 1..20) {
    AirBridge.getTracker().sendEvent(signUpEvent2)
}

for(i in 1..15) {
    AirBridge.getTracker().sendEvent(signUpEvent3)
}

for(i in 1..8) {
    AirBridge.getTracker().sendEvent(purchaseEvent1)
}

for(i in 1..7) {
    AirBridge.getTracker().sendEvent(purchaseEvent2)
}

for(i in 1..10) {
    AirBridge.getTracker().sendEvent(subscribeEvent1)
}

for(i in 1..5) {
    AirBridge.getTracker().sendEvent(subscribeEvent2)
}

에어브릿지 대시보드에서 Category 를 기준으로 각 이벤트의 개수 통계를 볼 수 있습니다.

Action 으로 같은 Category 의 이벤트들을 분리하고
Label 을 통해 분리된 것을 또 분리하여 통계를 볼 수 있습니다.

결과적으로 대시에보드에 아래와 같은 결과물을 얻을 수 있습니다.

Category

Action

Label

Count

회원가입

서울

10대

10

회원가입

서울

20대

20

회원가입

부산

10대

15

결제

간편결제 사용

카카오페이 사용

8

결제

간편결제 사용

토스 사용

7

구독

일반

10

구독

프리미엄

5

로그 확인

디버깅로그를 확인해야 하는 경우, 앱의 Application 클래스의 onCreate메서드에 다음 코드를 추가해 주세요.

AirBridge.setDebugMode(true);

고급 - Web App

Web App 의 경우, 다음과 같이 인앱이벤트를 전송할 수 있습니다.

Native 에서 Event 전송 (옵션 1)

Web 에서 android app 일 때, Native 함수를 호출해 Airbridge Android SDK 를 호출하면, Mobile Event 를 전송합니다.

Web 에서 browser 일 때, Airbridge Web SDK 를 호출하면, Web Event 를 전송합니다.

코드 예시 - Javascript

if (check Android app) {
    // When android app, send event with Airbridge Android SDK
    AirbridgeNative.goal('category')
} else {
    // When browser, send event with Airbridge Web SDK
    airbridge.events.send('category', {});
}

코드 예시 - JavascriptInterface

ublic class AirbridgeInterface {
    @JavascriptInterface
    public void goal(String category) {
        GoalEvent event = new GoalEvent(category);
        AirBridge.getTracker().sendEvent(event);
    }
}

...
webView.addJavascriptInterface(new AirbridgeInterface(), "AirbridgeNative");
class AirbridgeInterface {
    @JavascriptInterface
    fun goal(category: String) {
        val event = GoalEvent(category)
        AirBridge.getTracker().sendEvent(event)
    }
}

...
webView.addJavascriptInterface(AirbridgeInterface(), "AirbridgeNative");

Web 에서 Event 전송 (옵션 2)

Web 에서 android app 일 때, Airbridge Web SDK 에서 mobileApp 을 넣어 init 하면, Mobile Event 를 전송합니다.

Web 에서 browser 일 때, Airbridge Web SDK 에서 init 하면, Web Event 를 전송합니다.

코드 예시 - Javascript

(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(" "));

var deviceUUID = undefined;
var packageName = undefined;
var isLimitAdTracking = undefined;
var appVersion = undefined;
var ifa = undefined;
var ifv = undefined;
var gaid = undefined;
    
try {
    deviceUUID = window.AirbridgeDeviceInfo.getDeviceUUID();
    packageName = window.AirbridgeDeviceInfo.getPackageName();
    isLimitAdTracking = window.AirbridgeDeviceInfo.isLimitAdTracking();
    appVersion = window.AirbridgeDeviceInfo.getAppVersion();
} catch {}

try {
    ifa = window.AirbridgeDeviceInfo.getIFA();
    ifv = window.AirbridgeDeviceInfo.getIFV();
} catch {}

try {
    gaid = window.AirbridgeDeviceInfo.getGAID();
} catch {}
    
if (typeof deviceUUID === 'string'
    && typeof packageName === 'string'
    && typeof isLimitAdTracking === 'boolean'
    && typeof appVersion === 'string'
    && typeof ifa === 'string'
    && typeof ifv === 'string')
{
    // when ios app
    airbridge.init({
        app: 'APP_NAME',
        webToken: 'WEB_TOKEN',
        mobileApp: {
            deviceUUID: deviceUUID,
            packageName: packageName,
            limitAdTracking: isLimitAdTracking,
            appVersion: appVersion,
            ifa: ifa,
            ifv: ifv,
        }
    });
} else if (typeof deviceUUID === 'string' 
    && typeof packageName === 'string'
    && typeof isLimitAdTracking === 'boolean'
    && typeof appVersion === 'string'
    && typeof gaid === 'string') {
    // when android app
    airbridge.init({
        app: 'APP_NAME',
        webToken: 'WEB_TOKEN',
        mobileApp: {
            deviceUUID: deviceUUID,
            packageName: packageName,
            limitAdTracking: isLimitAdTracking,
            appVersion: appVersion,
            gaid: gaid,
        }
    });
} else {
    // when browser
    airbridge.init({
        app: 'APP_NAME',
        webToken: 'WEB_TOKEN'
    });
}
// when android app, send web event
// when browser, send mobile event
airbridge.events.send('category', {
    'label': 'label',
    'action': 'action',
    'value': 123.0,
    'customAttributes': {
        'custom1': 123,
        'custom2': 'abc'
    }
});

코드 예시 - Activity

public class MainActivity extends Activity {

    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fetchDeviceInfo((deviceInfo) -> runOnUiThread(() -> startWebView(deviceInfo)));
    }

    void startWebView(DeviceInfo deviceInfo) {
        webView = findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setDomStorageEnabled(true);

        webView.addJavascriptInterface(new DeviceInfoInterface(deviceInfo), "AirbridgeDeviceInfo");

        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new WebViewClient());

        webView.loadUrl("http://dev.blog.airbridge.io/websdk-web-app/");
    }

    class DeviceInfoInterface {

        DeviceInfo deviceInfo;

        public DeviceInfoInterface(DeviceInfo deviceInfo) {
            this.deviceInfo = deviceInfo;
        }

        @JavascriptInterface
        public String getDeviceUUID() {
            return deviceInfo.uuid;
        }

        @JavascriptInterface
        public String getPackageName() {
            return deviceInfo.packageName;
        }

        @JavascriptInterface
        public boolean isLimitAdTracking() {
            return deviceInfo.isLAT;
        }

        @JavascriptInterface
        public String getAppVersion() {
            return deviceInfo.appVersion;
        }
      
        @JavascriptInterface
        public String getGAID() {
            return deviceInfo.gaid;
        }
    }

    void fetchDeviceInfo(DeviceInfoFetchListener listener) {
        PackageInfo info = context.getPackageManager.getPackageInfo(context.packageName, 0);

        String packageName = getApplicationContext().getPackageName();
        String appVersion = info.versionName;
        AtomicReference<String> uuid = new AtomicReference<>(null);
        AtomicReference<Boolean> isLAT = new AtomicReference<>(null);
        AtomicReference<String> gaid = new AtomicReference<>(null);

        final Thread waitThread = new Thread(() -> {
            try { Thread.sleep(3000); }
            catch (InterruptedException ignored) {}

            if (uuid.get() != null && isLAT.get() != null && gaid.get() != null) {
                listener.onFetched(new DeviceInfo(packageName, appVersion, uuid.get(), isLAT.get(), gaid.get()));
            }
        });

        waitThread.start();
      
        final Thread fetchGAIDthread = new Thread(() -> {
            gaid.set( AdvertisingIdClient.getAdvertisingIdInfo(getApplicationContext()).getId());
            if (uuid.get() != null && isLAT.get() != null && gaid.get() != null) {
                waitThread.interrupt();
            }
        });
      
        fetchGAIDthread.start();

        AirBridge.getDeviceUUID(input -> {
            uuid.set(input);
            if (uuid.get() != null && isLAT.get() != null && gaid.get() != null) {
                waitThread.interrupt();
            }
        });

        AirBridge.isLimitADTracking(input -> {
            isLAT.set(input);
            if (uuid.get() != null && isLAT.get() != null && gaid.get() != null) {
                waitThread.interrupt();
            }
        });
    }

    interface DeviceInfoFetchListener {
        void onFetched(DeviceInfo deviceInfo);
    }

    class DeviceInfo {
        String packageName;
        String uuid;
        Boolean isLAT;
        String appVersion;
        String gaid;

        public DeviceInfo(String packageName, String appVersion, String uuid, Boolean isLAT, String gaid) {
            this.packageName = packageName;
            this.uuid = uuid;
            this.isLAT = isLAT;
            this.appVersion = appVersion;
            this.gaid = gaid;
        }
    }
}
class TempActivity : Activity() {

    var webView: WebView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fetchDeviceInfo { deviceInfo ->
            runOnUiThread { startWebView(deviceInfo) }
        }
    }

    fun startWebView(deviceInfo: DeviceInfo) {
        webView = findViewById(R.id.webView)
        webView?.settings?.javaScriptEnabled = true
        webView?.settings?.domStorageEnabled = true

        webView?.addJavascriptInterface(DeviceInfoInterface(deviceInfo), "AirbridgeDeviceInfo")

        webView?.webChromeClient = WebChromeClient()
        webView?.webViewClient = WebViewClient()

        webView?.loadUrl("https://...")

    }

    class DeviceInfoInterface(val deviceInfo: DeviceInfo) {
        @JavascriptInterface
        fun getDeviceUUID() : String {
            return deviceInfo.uuid
        }

        @JavascriptInterface
        fun getPackageName() : String {
            return deviceInfo.packageName
        }

        @JavascriptInterface
        fun isLimitAdTracking() : Boolean {
            return deviceInfo.isLAT
        }

        @JavascriptInterface
        fun getAppVersion() : String {
            return deviceInfo.appVersion
        }
      
        @JavascriptInterface
        fun getGAID() : String {
            return deviceInfo.gaid
        }
    }

    fun fetchDeviceInfo(callback: (DeviceInfo) -> Unit) {
        val info = context.packageManager.getPackageInfo(context.packageName, 0)

        val packageName: String = applicationContext.packageName
        var uuid: String? = null
        var isLAT: Boolean? = null
        var appVersion: String = info.versionName
        var gaid: String? = null

        val waitThread = Thread {
            try { Thread.sleep(3000) }
            catch (ignored: InterruptedException) {}

            if (uuid != null && isLAT != null && gaid != null) {
                callback(DeviceInfo(packageName, appVersion, uuid!!, isLAT!!, gaid!!))
            }
        }

        waitThread.start()
          
        val fetchGAIDThread = Thread {
            gaid = AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)!!.id
            if (uuid != null && isLAT != null && gaid != null) {
                waitThread.interrupt()
            }
        }
      
        fetchGAIDThread.start()

        AirBridge.getDeviceUUID { input ->
            uuid = input
            if (uuid != null && isLAT != null && gaid != null) {
                waitThread.interrupt()
            }
        }

        AirBridge.isLimitADTracking { input ->
            isLAT = input
            if (uuid != null && isLAT != null && gaid != null) {
                waitThread.interrupt()
            }
        }
    }

    class DeviceInfo(val packageName: String,
                     val uuid: String,
                     val isLAT: Boolean,
                     val appVersion: String,
                     val gaid: String)
}

고급

SDK 직접 설치

Airbridge SDK

sdk-android-1.8.0.aar : 다운로드

SDK 를 다운로드 받아 프로젝트에 적용해 주세요.

Google Play Installreferrer 라이브러리

installreferrer-1.1.aar : 다운로드

Google Play Installreferrer 라이브러리를 다운로드 받아 프로젝트에 적용해 주세요.

Google Play Installreferrer 라이브러리의 라이센스는 Apache 2.0 입니다.

유저 정보 수동 설정

회원가입, 로그인, 로그아웃 이벤트 외에도 유저 정보를 수동으로 설정할 수 있습니다.

설정하면 다음 설정이나 SignInEvent, SignUpEvent, SignOutEvent 이벤트 전송까지

모든 이벤트가 설정된 유저에서 발생한 것으로 기록됩니다.

AirBridge.getTracker().setUserID("testID");
AirBridge.getTracker().setUserEmail("[email protected]");
AirBridge.getTracker().setUserPhone("000-0000-0000");
AirBridge.getTracker().addUserAlias("key", "value");
AirBridge.getTracker().addUserAttribute("key", "value");
Map<String, Object> attrs = new HashMap<>();
attrs.set("key1", "value");
AirBridge.getTracker().setUserAttributes(attrs);
AirBridge.getTracker().setUserID("testID")
AirBridge.getTracker().setUserEmail("[email protected]")
AirBridge.getTracker().setUserPhone("000-0000-0000")
AirBridge.getTracker().addUserAlias("key", "value")
AirBridge.getTracker().addUserAttribute("key", "value")
AirBridge.getTracker().setUserAttributes(mapOf("key1" to "value"))

User Attribute 의 최대 갯수는 100개 입니다

User Attribute 의 key 길이는 최대 128자 입니다

User Attribute 의 key 는 ^[a-z][a-z0-9_]*$ 정규식을 만족해야 합니다

User Attribute 의 value는 Primitive 타입이어야 하며 String일 경우 길이는 최대 1024자 입니다

User Alias 의 개수는 최대 10개 입니다

User Alias 의 key 길이는 최대 128자 입니다

User Alias 의 key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다

User Alias 의 value 길이는 최대 1024자 입니다

User alias 및 attributes 정보는 SignInEvent, SignUpEvent 이벤트가 발생해도 변화하지 않습니다.

User alias 및 attributes 정보는 SignOutEvent 이벤트가 발생하면 초기화 됩니다.

디바이스 정보 수동 설정

추가 디바이스 정보를 입력합니다.

HashMap<String, String> deviceAlias = new HashMap<String, String>();
deviceAlias.put("key", "value");

AirBridge.getTracker().setDeviceAlias(deviceAlias);
AirBridge.getTracker().addUserAlias("key", "value");
val deviceAlias = HashMap<String, String>()
deviceAlias["key"] = "value"

AirBridge.getTracker().setDeviceAlias(deviceAlias);
AirBridge.getTracker().addUserAlias("key", "value");

Device Alias 의 개수는 최대 10개 입니다.

Device Alias 의 key 길이는 최대 128 입니다.

Device Alias 의 value 길이는 최대 128 입니다.

Device Alias 의 key 는 [a-z_][a-z0-9_]* 조건을 만족해야 합니다.

WebView 에서 인앱 이벤트 전송

WebView 를 사용하는 앱의 경우
WebView 의 Javascript Interface 기능을 통해 Airbridge SDK를 호출하여 인앱이벤트를 전송할 수 있습니다.

public class MyWebAppInterface {
    Context mContext;

    MyWebAppInterface(Context context) {
        mContext = context;
    }

    /**
     * Sends goal event.
     */
    @JavascriptInterface
    public void goal(int value) {
        // TODO: 원하는 인앱이벤트를 보내주세요.
        GoalEvent event = new GoalEvent("my-category")
                .setAction(“my-action”);            
                .setValue(value);            
        AirBridge.getTracker().sendEvent(event);
    }
}

...
webView.addJavascriptInterface(new MyWebAppInterface(this), "myAndroid");
class MyWebAppInterface constructor(internal var mContext: Context){
    /**
    * Sends goal event.
    */
    @JavascriptInterface
    fun goal(value: Int) {
         // TODO: 원하는 인앱이벤트를 보내주세요.
         val event = GoalEvent("my-category")
                .setAction("my-action")
                .setValue(value)
        AirBridge.getTracker().sendEvent(event)
    }
}

...        
webView.addJavascriptInterface(MyWebAppInterface(this), "myAndroid")

위와 같이 Javascript Interface를 생성하고
웹 앱 (Javascript) 내에선 다음과 같이 메서드를 호출할 수 있습니다.

myAndroid.goal(1234);

별도 설치 레퍼러 추적 도구를 사용

app/src/main/AndroidManifest.xml 파일의 io.airbridge.DeferredLinkReceiver 항목에 서드파티 리시버를 원하는 이름으로 등록해 주세요.

<receiver android:name="io.airbridge.DeferredLinkReceiver" android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
    <!-- For GA Campaign Receiver -->
    <meta-data android:name="GAReceiver" android:value="com.google.android.gms.analytics.CampaignTrackingReceiver"/>
    <!-- For Custom Receiver -->
    <meta-data android:name="CustomReceiver1" android:value="io.airbridge.test.TPReceiver"/>
</receiver>

특정 화면을 트래킹에서 제외

일반적으로 에어브릿지는 액티비티를 자동으로 트래킹하여 통계를 제공합니다.

하지만 특수한 액티비티로 인해 의도치 않은 통계가 측정될 수 있습니다.

예를 들어, 앱에서 잠금 화면을 제공한다면 에어브릿지는 사용자가 잠금 화면을 열 때마다 실행으로 감지하게 됩니다.

이처럼 의도치 않은 통계가 측정되는 상황을 방지하려면

해당 액티비티에 @DontTrack 어노테이션을 추가하여 예외로 표시해 주세요.

에어브릿지는 예외 표시된 액티비티의 경우, 트래킹하지 않습니다.

@DontTrack
class LockscreenActivity extends Activity { ... }
@DontTrack
class LockscreenActivity : Activity { ... }

Android 4.0 (API 14) 미만을 지원

에어브릿지 SDK는 설치 및 실행 통계 제공을 위해 자동으로 앱 생명주기를 트래킹합니다.

하지만 Android 4.0 (API Level 14) 미만 버전의 경우 자동 트래킹이 불가능해 통계를 제대로 수집할 수 없습니다.

따라서 통계 수집을 위해 수동 트래킹을 사용하셔야 합니다.

자동 생명주기 트래킹 끄기

AirBridge.init 코드 이전에 다음 메서드를 호출하여 자동 트래킹을 꺼주세요.

PageTracker.disableAutoLifecycleTracking();
AirBridge.init(this, ...);
PageTracker.disableAutoLifecycleTracking()
AirBridge.init(this, ...)

액티비티 생명주기 핸들러 수동 호출

앱 내 모든 액티비티가 상속받는 Base Activity 에서 핸들러를 수동 호출하면

앱 내 액티비티에 대한 생명주기 트래킹이 이루어 집니다.

class BaseActivity extends Activity {
    @Override
    public void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        AirBridge.getLifecycleTracker().onActivityCreated(this, savedState);
    }

    @Override
    public void onResume() {
        super.onResume();
        AirBridge.getLifecycleTracker().onActivityResumed(this);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        AirBridge.getLifecycleTracker().onActivityDestroyed(this);
    }
}
class BaseActivity : Activity() {
    override fun onCreate(savedState: Bundle?) {
        super.onCreate(savedState)
        AirBridge.getLifecycleTracker().onActivityCreated(this, savedState)
    }

    override fun onResume() {
        super.onResume()
        AirBridge.getLifecycleTracker().onActivityResumed(this)
    }

    override fun onDestroy() {
        super.onDestroy()
        AirBridge.getLifecycleTracker().onActivityDestroyed(this)
    }
}

UUID 정보획득

DeviceUUID 가져오기

DeviceUUID를 가져옵니다.

AirBridge.getDeviceUUID(new AirBridge.UUIDCallback() {
    @Override
    public void done(String uuid) {

    }
});
AirBridge.getDeviceUUID{ uuid ->

}

ADID 허용 여부 가져오기

ADID 허용 여부를 가져옵니다.

AirBridge.isLimitADTracking(new AirBridge.ADIDCallback() {
    @Override
    public void done(Boolean isLAT) {

    }
});
AirBridge.isLimitADTracking{ isLAT ->

}

추적 중지 (Opt-out)

SDK 에서 이벤트를 전송하는 기능을 중지할 수 있습니다.

AirBridge.setLimitUserTracking(true);
AirBridge.setLimitUserTracking(true);

true : 추적 중지

false : 추적

업데이트

이전 버전에서 SDK 를 업데이트 하시는 경우, 아래를 확인해주세요.

1.6.14 이전 버전

1. 지연된 딥링크

DeepLink.registerDeferredLink 함수를 AirBridge.init 함수 호출 이전에 호출해 주세요.

DeepLink.registerDeferredLinkCallback(new DeepLink.Callback() {
    @Override
    public void TrackingLinkResponse(String URL, HashMap<String, String> param) {
        // 처리
    }
});
AirBridge.init();
DeepLink.registerDeferredLinkCallback { URL, param ->
    // 처리
}
AirBridge.init();

2. 딥링크

DeepLink.registerDeepLinkCallback 함수를 AirBridge.init 함수 호출 이전에 호출해 주세요.

DeepLink.registerDeepLinkCallback(new DeepLink.Callback() {
    @Override
    public void TrackingLinkResponse(String URL, HashMap<String, String> param) {
        // 처리
    }
});
AirBridge.init();
DeepLink.registerDeepLinkCallback { URL, param ->
    // 처리
}
AirBridge.init();