Android SDK

Android SDK

설치link

1. build.gradlelink

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

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

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

2. AndroidManifest.xmllink

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

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

3. Proguardlink

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.javalink

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, "[앱 이름]", "[앱 토큰]");
}

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

설치 - 딥링크 - 등록link

딥링크 기능을 사용하기 위해 앱의 정보들을 에어브릿지 대시보드에 등록합니다.
대시보드에 접속하시고 사이드바의 Deeplinks 메뉴를 클릭하면 아래와 같은 화면이 나옵니다.

deeplinks

Schemelink

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

예) scheme://

  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

설치 - 딥링크 - codelink

AndroidManifest.xmllink

  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 값을 입력해주세요.

딥링크로 열리는 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);
}

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

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

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

  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 부분에 설정한 커스텀 도메인을 넣어주세요.

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 은 서로 동일하면 안됩니다.

설치 확인link

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

인앱 이벤트link

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

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

모든 이벤트에 첨부되는 모든 정보는 선택적으로 추가할 수 있습니다.
그러나 이벤트에 대한 많은 정보는 정확한 통계 제공에 도움이 됨으로 추가하는 것을 권장합니다.

인앱 이벤트 - 회원link

회원 인앱 이벤트는 크로스 플랫폼 사용자 매칭 의 구성요소입니다.
가능하면 하나이상의 유저 정보를 포함하여 전송해 주시기 바랍니다.

회원가입 및 로그인 이벤트가 발생한 경우,
다음 로그아웃 이벤트 발생까지 모든 이벤트가 해당 유저에서 발생한 것으로 기록됩니다.

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

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

회원가입link

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

생성자link

이름파라미터설명
SignUpEvent-비어있는 회원가입 이벤트

매서드link

이름파라미터설명
setUserIdString userId
회원가입하는 유저의 아이디
유저의 아이디를 설정
setUserEmailString userEmail
회원가입하는 유저의 이메일
유저의 이메일을 설정
setUserPhoneString userPhone
회원가입하는 유저의 휴대전화 번호
유저의 휴대전화 번호를 설정

코드 예시link

SignUpEvent event = new SignUpEvent()
.setUserId("test-user-id")
.setUserEmail("test-email@foo.com")
.setUserPhoneNumber("000-0000-0000");
AirBridge.getTracker().sendEvent(event);

로그인link

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

생성자link

이름파라미터설명
SignInEvent-비어있는 로그인 이벤트

매서드link

이름파라미터설명
setUserIdString userId
회원가입하는 유저의 아이디
유저의 아이디를 설정
setUserEmailString userEmail
회원가입하는 유저의 이메일
유저의 이메일을 설정
setUserPhoneString userPhone
회원가입하는 유저의 휴대전화 번호
휴대전화 번호를 설정

코드 예시link

SignInEvent event = new SignInEvent()
.setUserId("test-user-id")
.setUserEmail("test-email@foo.com");
.setUserPhoneNumber("000-0000-0000");
AirBridge.getTracker().sendEvent(event);

로그아웃link

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

생성자link

이름파라미터설명
SignOutEvent-비어있는 로그아웃 이벤트

코드 예시link

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

인앱 이벤트 - 커머스link

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

Product 클래스link

상품 클래스입니다.

생성자link

이름파라미터설명
Product-비어 있는 상품

메서드link

이름파라미터설명
setProductIdString productId
상품의 고유 ID
상품의 고유 ID 설정
setNameString name
상품 이름
상품 이름 설정
setCurrencyString currency
상품 통화
상품 통화 설정
ISO 4217 standard에 따름
setPriceInteger price
상품 금액
상품 금액 설정
setQuantityInteger quantity
상품 수량
상품 수량 설정
setPositionInListInteger positionInList
리스트 중 상품 위치
리스트 중 상품 위치 설정

코드 예시link

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

홈 화면 조회link

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

생성자link

이름파라미터설명
HomeViewEvent-홈 뷰 이벤트

코드 예시link

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

상품 리스트 조회link

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

생성자link

이름파라미터설명
ProductListViewEvent-비어있는 상품 리스트 조회 이벤트
ProductListViewEventString listId
상품 리스트의 고유 아이디
List<Product> products
상품 리스트
상품 리스트 아이디와 상품 리스트가 포함된
상품 리스트 조회 이벤트
ProductListViewEventString listId
상품 리스트의 고유 아이디
Product product
상품
리스트 아이디와 단일 상품이 포함된
상품 리스트 조회 이벤트

메서드link

이름파라미터설명
setListIdString listId
상품 리스트의 고유 아이디
상품 리스트 아이디 설정
addProductProduct product
상품
상품 리스트에 상품 추가
addProductsList<Product> products
상품 리스트
상품 리스트에 상품 리스트 추가

코드 예시link

// 상품 정보 생성
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);
  • 사용자가 리스트를 스크롤하여 새로운 정보를 로드할 경우
    추가적으로 로드된 상품 정보로 해당 이벤트를 별도로 생성하여 전송하시는 것을 권장합니다.

검색결과 조회link

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

생성자link

이름파라미터설명
SearchResultViewEvent-비어있는 검색결과 이벤트
SearchResultViewEventString query
검색어
List<Product> products
검색 결과 상품 리스트
검색어와 상품 리스트인 검색 결과가 포함된
검색결과 이벤트
SearchResultViewEventString query
검색어
Product product
검색 결과 상품
검색어와 단일 상품인 검색 결과가 포함된
검색결과 이벤트

메서드link

이름파라미터설명
setQueryString query
검색어
검색어 정보 설정
addProductProduct
상품
검색 결과인 상품 추가
addProductsList<Product>
상품 리스트
검색 결과인 상품 리스트 추가

코드 예시link

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

상품 상세페이지 조회link

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

생성자link

이름파라미터설명
ProductDetailsViewEvent-비어있는 상품 상세페이지 조회 이벤트
ProductDetailsViewEventList<Product>
상품 리스트
여러 상품에 대한 상품 상세페이지 조회 이벤트
ProductDetailsViewEventProduct
상품
단일 상품에 대한 상품 상세페이지 조회 이벤트

코드 예시link

ProductDetailsViewEvent event = new ProductDetailsViewEvent(product);
AirBridge.getTracker().sendEvent(event);

장바구니 담기link

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

생성자link

이름파라미터설명
AddedToCartEvent-장바구니 담기 이벤트
AddedToCartEventString cartId
장바구니의 고유 아이디
List<Product> products
상품 리스트
장바구니의 고유 아이디와 여러 상품이 포함된
장바구니 담기 이벤트
AddedToCartEventString cartId
장바구니의 고유 아이디
Product product
상품
장바구니의 고유 아이디와 단일 상품이 포함된
장바구니 담기 이벤트

메서드link

이름파라미터설명
setCartIdString cartId
장바구니 고유 아이디
장바구니 고유 아이디 설정
addProductProduct
상품
장바구니에 추가할 상품 추가
addProductsList<Product> products
상품 리스트
장바구니에 추가할 상품 리스트 추가
setCurrencyString장바구니에 추가할 물품들의 총 금액의 통화 설정
ISO 4217 standard에 따름
setTotalValueFloat장바구니에 추가할 물품들의 총 금액 설정

코드 예시link

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

결제link

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

생성자link

이름파라미터설명
PurchaseEvent-결제 이벤트
PurchaseEventList<Product> products
상품 리스트
여러 상품에 대한 결제 이벤트
PurchaseEventProduct product
상품
단일 상품에 대한 결제 이벤트

메서드link

이름파라미터설명
addProductProduct product
상품
결제한 상품 추가
addProductsList<Product> product
상품 리스트
결제한 상품 리스트 추가
setInAppPurchaseBoolean isInAppPurchase
인앱 결제 여부
인앱 결제 여부 설정
setTotalValueFloat totalValue
총 결제 금액
총 결제 금액 설정
setTransactionIdString transactionId
결제의 고유 ID
결제의 고유 ID 설정
setCurrencyString currency
결제한 금액의 통화 단위
결제한 금액의 통화 설정
ISO 4217 standard에 따름

코드 예시link

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

인앱 이벤트 - 커스텀link

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

생성자link

이름파라미터설명
GoalEventString category
이벤트 이름
category가 포함되어있는 커스텀 이벤트

메서드link

이름파라미터설명
setCategoryString이벤트 이름
setActionString이벤트 하위 분류 1
setLabelString이벤트 하위 분류 2
setValueInteger이벤트 커스텀 값
setCustomAttributeString, Object 이벤트 커스텀 정보

코드 예시link

GoalEvent event = new GoalEvent("category")
.setAction("action")
.setLabel("label")
.setValue(3412);
AirBridge.getTracker().sendEvent(event);

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

추가 수집link

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

App 에서 딥링크 실행 및 추적link

아래와 같은 코드를 사용해서 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() 을 호출하였다면, AirBridge.initPlacement() 를 호출하지 않아도 됩니다.
AirBridge.init() 을 호출하지 않았다면, AirBridge.initPlacement() 를 호출해 주세요.

clicklink

click 함수는 해당 트래킹링크 의 click 통계를 1개 추가하고 설정된 App, Web 또는 Fallback 으로 이동합니다.
해당 트래킹링크 가 클릭되었을 때, 호출해 주세요.

click 함수에서 deeplink, fallback 은 인터넷 연결이 없을 때 사용하는 백업 링크 입니다.
deeplink 파라미터는 Custom URL Scheme 형식의 딥링크만 사용가능 합니다. (모두 optional 파라미터 입니다.)

impressionlink

impression 함수는 해당 트래킹링크 의 impression 통계를 1개 추가합니다.
해당 트래킹링크 가 UI 에 표시되었을 때, 호출해 주세요.

커스텀 도메인 을 사용하는 중 이라면, 커스텀 Short ID 를 사용한 트래킹링크 는 사용할 수 없습니다.
example: http://deeplink.ab180.co/custom -> 사용불가
example: http://deeplink.ab180.co/a3b1c2 -> 사용가능
example: https://abr.ge/a3b1c2 -> 사용가능

설치된 앱 리스트link

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

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

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

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

유저 통신사 이름 수집link

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

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

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

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

설정link

세션 기간link

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

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

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

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

유저 정보 암호화 해제link

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

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

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

인앱 이벤트 구분link

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

Category 는 이벤트의 이름 입니다.
Action 은 이벤트의 하위 분류 1 입니다.
Label 은 이벤트의 하위 분류 2 입니다.

모든 인앱 이벤트는 Action 과 Label 을 수정할 수 있습니다.
커스텀 인앱 이벤트는 Category 지정이 가능하고 기본제공 인앱 이벤트는 Category 지정이 불가능합니다.

코드 예시link

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

에어브릿지 대시보드에서 Category 를 기준으로 각 이벤트의 개수 통계를 볼 수 있습니다.
Action 으로 같은 Category 의 이벤트들을 분리하고
Label 을 통해 분리된 것을 또 분리하여 통계를 볼 수 있습니다.

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

CategoryActionLabelCount
회원가입서울10대10
회원가입서울20대20
회원가입부산10대15
결제간편결제 사용카카오페이 사용8
결제간편결제 사용토스 사용7
구독일반10
구독프리미엄5

로그 확인link

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

AirBridge.setDebugMode(true);

고급 - Web Applink

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

Native 에서 Event 전송 (옵션 1)link

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

코드 예시 - Javascriptlink

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', {});
}

코드 예시 - JavascriptInterfacelink

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

Web 에서 Event 전송 (옵션 2)link

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

코드 예시 - Javascriptlink

(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;
try {
deviceUUID = window.AirbridgeDeviceInfo.getDeviceUUID();
packageName = window.AirbridgeDeviceInfo.getPackageName();
isLimitAdTracking = window.AirbridgeDeviceInfo.isLimitAdTracking();
appVersion = window.AirbridgeDeviceInfo.getAppVersion();
} catch {}
if (typeof deviceUUID === 'string'
&& typeof packageName === 'string'
&& typeof isLimitAdTracking === 'boolean'
&& typeof appVersion === 'string')
{
// when android app
airbridge.init({
app: 'ablog',
webToken: '8ec37a00b37a4576a7f8bdf8d5164dd5',
mobileApp: {
deviceUUID: deviceUUID,
packageName: packageName,
limitAdTracking: isLimitAdTracking,
appVersion: appVersion,
}
});
} else {
// when browser
airbridge.init({
app: 'ablog',
webToken: '8ec37a00b37a4576a7f8bdf8d5164dd5'
});
}
// 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'
}
});

코드 예시 - Activitylink

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;
}
}
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);
final Thread thread = new Thread(() -> {
try { Thread.sleep(3000); }
catch (InterruptedException ignored) {}
if (uuid.get() != null && isLAT.get() != null) {
listener.onFetched(new DeviceInfo(packageName, appVersion, uuid.get(), isLAT.get()));
}
});
thread.start();
AirBridge.getDeviceUUID(input -> {
uuid.set(input);
if (uuid.get() != null && isLAT.get() != null) {
thread.interrupt();
}
});
AirBridge.isLimitADTracking(input -> {
isLAT.set(input);
if (uuid.get() != null && isLAT.get() != null) {
thread.interrupt();
}
});
}
interface DeviceInfoFetchListener {
void onFetched(DeviceInfo deviceInfo);
}
class DeviceInfo {
String packageName;
String uuid;
Boolean isLAT;
String appVersion;
public DeviceInfo(String packageName, String appVersion, String uuid, Boolean isLAT) {
this.packageName = packageName;
this.uuid = uuid;
this.isLAT = isLAT;
this.appVersion = appVersion
}
}
}

고급link

SDK 직접 설치link

Airbridge SDKlink

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

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

Google Play Installreferrer 라이브러리link

installreferrer-1.1.aar : 다운로드

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

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

유저 정보 수동 설정link

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

설정하면 다음 설정이나 SignInEvent, SignUpEvent, SignOutEvent 이벤트 전송까지
모든 이벤트가 설정된 유저에서 발생한 것으로 기록됩니다.

AirBridge.getTracker().setUserID("testID");
AirBridge.getTracker().setUserEmail("testID@ab180.co");
AirBridge.getTracker().setUserPhone("000-0000-0000");
AirBridge.getTracker().addUserAlias("key", "value");
AirBridge.getTracker().addUserAttribute("key", "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 이벤트가 발생하면 초기화 됩니다.

디바이스 정보 수동 설정link

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

HashMap<String, String> deviceAlias = new HashMap<String, String>();
deviceAlias.put("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 에서 인앱 이벤트 전송link

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

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

myAndroid.goal(1234);

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

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>

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

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

하지만 특수한 액티비티로 인해 의도치 않은 통계가 측정될 수 있습니다.
예를 들어, 앱에서 잠금 화면을 제공한다면 에어브릿지는 사용자가 잠금 화면을 열 때마다 실행으로 감지하게 됩니다.

이처럼 의도치 않은 통계가 측정되는 상황을 방지하려면
해당 액티비티에 @DontTrack 어노테이션을 추가하여 예외로 표시해 주세요.

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

@DontTrack
class LockscreenActivity extends Activity { ... }

Android 4.0 (API 14) 미만을 지원link

에어브릿지 SDK는 설치 및 실행 통계 제공을 위해 자동으로 앱 생명주기를 트래킹합니다.
하지만 Android 4.0 (API Level 14) 미만 버전의 경우 자동 트래킹이 불가능해 통계를 제대로 수집할 수 없습니다.
따라서 통계 수집을 위해 수동 트래킹을 사용하셔야 합니다.

자동 생명주기 트래킹 끄기link

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

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

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

앱 내 모든 액티비티가 상속받는 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);
}
}

UUID 정보획득link

DeviceUUID 가져오기link

DeviceUUID를 가져옵니다.

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

ADID 허용 여부 가져오기link

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

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

추적 중지 (Opt-out)link

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

AirBridge.setLimitUserTracking(true);

true : 추적 중지
false : 추적

업데이트link

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

1.6.14 이전 버전link

1. 지연된 딥링크link

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

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

2. 딥링크link

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

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