Android SDK

SDK 설치

Download v2.24.0

패키지 설치

Gradle 설치

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

123456789
allprojects {
    ...
    repositories {
        ...
        maven { url "https://sdk-download.airbridge.io/maven" }
        ...
    }
    ...
}

Android Studio Arctic Fox(2020.3.1) 이후 버전을 사용하여 프로젝트를 생성하거나, Repository setting을 settings.gradle 파일 내에서 진행하는 경우 project/settings.gradle 파일의 dependencyResolutionManagement/repositories 블럭 안에 다음과 같은 라인을 추가해 주세요.

123456789
dependencyResolutionManagement {
    ...
    repositories {
        ...
        maven { url "https://sdk-download.airbridge.io/maven" }
        ...
    }
    ...
}

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

12345
dependencies {
    ...
    implementation "io.airbridge:sdk-android:2.+"
    ...
}

직접 설치

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

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

라이브러리

링크

Airbridge SDK

다운로드

JetBrains Java Annotations

다운로드

Kotlin Standard Library

다운로드

Kotlinx Coroutines Core

다운로드

Kotlinx Coroutines Android

다운로드

에어브릿지 안드로이드 SDK는 Kotlin stdlib 및 Kotlinx coroutines 라이브러리 버전 1.4 이상을 필요로 합니다.

프로젝트 설정

Min SDK 16

권한 추가

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

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

초기화

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

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

주의하세요

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

해당 YOUR_APP_NAME과 YOUR_APP_SDK_TOKENAirbridge 대시보드Settings > Tokens 탭에서 확인하실 수 있습니다.

SDK 설치 확인

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

로그캣(LogCat) 확인

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

주의하세요

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

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

대시보드에서 확인

  1. 해당 테스트를 원하는 디바이스에 앱을 설치하여 실행해 주세요.

  2. Airbridge 대시보드 > Raw Data > App Real-time Logs로 이동해주세요.

  3. 검색창에 해당 기기의 Google Advertising ID를 입력해 주세요.

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

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

딥링크 설정

대시보드 설정

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

  • URI Scheme

  • Package Name

  • sha256_cert_fingerprints

Scheme 등록

사용하는 URI 스킴(URI Scheme)을 안드로이드 URI 스킴에 ://를 포함하여 입력해 주세요. 에어브릿지의 URI 스킴은 영어 소문자, 숫자 그리고 -, +만 지원합니다.

주의하세요

출시 앱 또는 출시 예정 앱과 개발용 앱의 URI 스킴을 다르게 등록해 주세요.

출시 앱 또는 출시 예정 앱과 개발용 앱의 URI 스킴이 동일하면 딥링크가 작동하는 과정에서 의도하지 않은 앱이 실행될 수 있습니다.

패키지 이름 등록

출시 앱의 패키지 이름은 에어브릿지 대시보드에 앱을 등록하면서 입력한 앱마켓 URL을 통해 자동으로 입력됩니다.

출시 예정 앱, 개발용 앱과 같이 출시하지 않은 앱의 딥링크를 설정하기 위해서는 패키지 이름을 직접 입력해야 합니다.

Fingerprint 등록

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

  1. Google Play Store에 앱을 등록할 때 사용한 keystore파일을 준비해 주세요.

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

    Shell
    1
    keytool -list -v -keystore my-release-key.keystore
  3. 하단과 같이 Certificate fingerprints 영역의 SHA256 값을 복사해, 상단의 사진과 같이 Android sha256_cert_fingerprints 영역에 입력해 주세요.

    Shell
    1234
    Certificate fingerprints:
        MD5:  4C:65:04:52:F0:3F:F8:65:08:D3:71:86:FC:EF:C3:49
        SHA1: C8:BF:B7:B8:94:EA:5D:9D:38:59:FE:99:63:ED:47:B2:D9:5A:4E:CC
        SHA256: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99

    Android sha256_cert_fingerprints는 쉼표(’,’)로 구분해서 여러 값을 등록할 수 있습니다

프로젝트 설정

Intent Filter 설정

airbridge android SDK v2.21.1 이상 버전을 사용중이라면 하단에 명시된 절차에 따라서 Intent Filter를 설정해 주세요. airbridge android SDK v2.21.0 이하 버전을 사용중이라면 바로가기 에 설정된 절차를 따라서 설정해 주세요.

  1. AndroidManifest.xml파일을 열어주세요.

  2. 딥링크를 처리할 ActivityIntent Filter를 다음과 같이 추가해 주세요.

    123456789101112131415161718192021222324252627282930
    <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.abr.ge" />
            <data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
        </intent-filter>
        <intent-filter android:autoVerify="true">
            <action android:name="android.intent.action.VIEW" />
    
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
    
            <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.abr.ge: Airbridge App Links 버전 2

    • YOUR_APP_NAME.airbridge.io: Airbridge App Links 버전 1

    • YOUR_APP_URI_SCHEME: URI Scheme 방식의 딥링크

딥링크 콜백 설정

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

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

디퍼드 딥링크 설정

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

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

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

딥링크 설정 확인

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

  • YOUR_APP_URI_SCHEME://

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

사용자 설정

사용자 식별자 설정

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

  • User Email : 이메일

  • User Phone : 전화번호

  • User ID : 사용자 고유 ID (사용자의 특정할 수 있는 ID 값으로 웹과 앱에서 1:1로 대응되어야 합니다)

  • User Alias : 사용자를 나타낼 수 있는 기타 ID (e.g. 로열티 프로그램용 ID, 계열사 통합 ID 등등)

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

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

1234567891011
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.getCurrentUser().setEmail("testID@ab180.co");
Airbridge.getCurrentUser().setPhone("821012341234");

// Does not hash 
Airbridge.getCurrentUser().setId("testID");
Airbridge.getCurrentUser().setAlias("key", "value");

// Clear user data
Airbridge.expireUser()
  • User Alias의 개수는 최대 10개입니다.

  • User Alias의 key 는 String타입이며, 길이는 최대 128자입니다.

  • User Alias의 key 는 ^[a-zA-Z_][a-zA-Z0-9_]*$ 정규식을 만족해야 합니다.

  • User Alias의 value 는 String타입이며 String의 경우 최대 128자입니다.

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

사용자 속성 설정

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

1
Airbridge.getCurrentUser().setAttribute("key", "value");
  • User Attribute의 개수는 최대 100개입니다.

  • User Attribute의 key 는 String 타입이며, 길이는 최대 128자입니다.

  • User Attribute의 key 는 ^[a-zA-Z_][a-zA-Z0-9_]*$ 정규식을 만족해야 합니다.

  • User Attribute의 value 는 Integer, Float, Long, Boolean 타입String 타입이며, String의 경우 최대 1024자입니다.

사용자 설정 확인

에어브릿지 SDK에서 설정한 유저 정보는 Airbridge 대시보드Raw Data > App Real-time Log 탭에서 다음과 같이 확인하실 수 있습니다.

디바이스 설정

디바이스 식별자 설정

SDK에 디바이스 식별자 정보를 설정해 이후 수집되는 모든 이벤트에 디바이스 식별정보를 포함시킬 수 있습니다. 디바이스 식별자가 설정되면 별도로 삭제하지 않을 경우 앱 종료 여부에 관계없이 계속 유지됩니다.

123
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
Airbridge.clearDeviceAlias();

메소드

설명

setDeviceAlias(key: String, value: String)

전달한 Key와 Value 쌍을 디바이스 식별자에 추가합니다.

removeDeviceAlias(key: String)

전달한 Key에 해당하는 디바이스 식별자를 삭제합니다. 해당하는 식별자가 없을 경우 아무런 동작을 하지 않습니다.

clearDeviceAlias()

모든 디바이스 식별자를 삭제합니다.

이벤트 설정

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

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

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

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

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

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

  • Event Semantic Attributes : 이벤트 하위의 시멘틱 데이터 (Map<String, Object>)

이벤트 전송

에어브릿지 SDK에서는 다음과 같은 방법을 통해 이벤트를 전송할 수 있습니다.

12345
Number eventValue = 10;
Map<String, Object> eventAttributes = new HashMap<String, Object>();
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.put(SemanticAttributes.KEY_CURRENCY, "USD");
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW, "event_action", "event_label", eventValue, eventAttributes, semanticAttributes);

제공되는 카테고리 유형으로 해결되지 않는 특정한 요구사항이 존재하는 경우 다음과 같은 방법을 통하여 맞춤 이벤트를 직접 전송할 수 있습니다.

12345
Number eventValue = 10;
Map<String, String> eventAttributes = new HashMap<String, String>();
Map<String, String> semanticAttributes = new HashMap<String, String>();
semanticAttributes.put(SemanticAttributes.KEY_CURRENCY, "USD");
Airbridge.trackEvent("event_category", "event_action", "event_label", eventValue, eventAttributes, semanticAttributes);

에어브릿지 SDK에서 지원되는 Semantic Attirbutes에 대한 자세한 사항은 해당 페이지에서 확인 가능합니다.

또한 다음과 같은 방법을 통하여 각 앱에 맞는 이벤트를 미리 정의된 클래스 형태로 사용할 수 있습니다.

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

스탠다드 이벤트 전송

회원가입 이벤트

123456
Airbridge.getCurrentUser().setEmail("me@sample.com");
Airbridge.getCurrentUser().setPhone("821012341234");
Airbridge.getCurrentUser().setId("12345");
Airbridge.getCurrentUser().setAlias("alias1", "value");
Airbridge.getCurrentUser().setAttributes("attr1", 1234);
Airbridge.trackEvent(StandardEventCategory.SIGN_UP);

로그인 이벤트

123456
Airbridge.getCurrentUser().setEmail("me@sample.com");
Airbridge.getCurrentUser().setPhone("821012341234");
Airbridge.getCurrentUser().setId("12345");
Airbridge.getCurrentUser().setAlias("alias1", "value");
Airbridge.getCurrentUser().setAttributes("attr1", 1234);
Airbridge.trackEvent(StandardEventCategory.SIGN_IN);

로그아웃 이벤트

12
Airbridge.trackEvent(StandardEventCategory.SIGN_OUT);
Airbridge.expireUser();

메인 화면 조회

1
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW);

검색 결과 조회

123
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setQuery("Coca Cola");
Airbridge.trackEvent(StandardEventCategory.SEARCH_RESULT_VIEW, null, null, null, null, semanticAttributes);

상품 리스트 조회

1234567891011121314151617181920
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);

Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);

SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProductListId("beverage_1");
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
Airbridge.trackEvent(StandardEventCategory.PRODUCT_LIST_VIEW, null, null, null, null, semanticAttributes);

상품 상세 페이지 조회

12345678910111213141516171819
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);

Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);

SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
Airbridge.trackEvent(StandardEventCategory.PRODUCT_DETAILS_VIEW, null, null, null, null, semanticAttributes);

장바구니 담기

12345678910111213141516171819202122232425
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);

Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);

SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setCartId("cart_123");
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
semanticAttributes.setCurrency("usd");

Event event = new Event(StandardEventCategory.ADD_TO_CART);
event.setValue(4.98);
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);

결제 완료

12345678910111213141516171819202122232425
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);

Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);

SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
semanticAttributes.setCurrency("usd");
semanticAttributes.setInAppPurchased(true);

Event event = new Event(StandardEventCategory.ORDER_COMPLETED);
event.setValue(4.98);
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);

이벤트 전송 확인

에어브릿지 SDK에서 전송된 이벤트 정보는 Airbridge 대시보드Raw Data >  App Real-time Log 탭에서 다음과 같이 확인하실 수 있습니다.

고급 설정

Restricted SDK

개인정보보호법 등으로 인해 ADID 수집이 불가능 한 경우 기존 SDK 대신 ADID 수집 기능이 제거된 restricted SDK 를 사용 할 수 있습니다. restricted SDK 는 v2.22.2 부터 지원됩니다.

Gradle 설치

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

12345
dependencies {
    ...
    implementation "io.airbridge:sdk-android-restricted:2.+"
    ...
}

직접 설치

라이브러리

링크

Airbridge SDK restricted

다운로드

SDK Signature 설정

SDK Signature 를 설정하는 것으로 SDK 를 SDK Spoofing 으로 부터 보호할 수 있습니다.

SDK 를 초기화하는 코드 상단에 setSDKSignatureSecret 함수를 호출해 설정을 변경하실 수 있습니다.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        .setSDKSignatureSecret("YOUR_SDK_SIGNATURE_SECRET_ID", "YOUR_SDK_SIGNATURE_SECRET")
        .build();
Airbridge.init(this, config);

SDK Signature 를 설정하기 위해서는 SDK Signature Secret, SDK Signature Secret ID 2가지가 필요합니다.

해당 2가지 값을 발급받기 위해서는 담당 에어브릿지 CSM 에게 지원을 요청해주세요.

사용자 정보 해시화 설정

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

주의하세요

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

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

세션 타임아웃 설정

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

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

개인정보보호(Opt-out) 설정

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

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

123456789101112
// 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();
}

Airbridge 링크만 추적 설정

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

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

  • 대시보드에 등록된 형태의 딥링크를 통해 앱이 오픈 된 경우

  • airbridge.io딥링크를 통해 앱이 오픈 된 경우

  • deeplink.page딥링크를 통해 앱이 오픈 된 경우

  • abr.ge딥링크를 통해 앱이 오픈 된 경우

  • airbridge_referrerquery 정보가 존재하는 경우

12345
// Default Airbridge Link Only = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackAirbridgeLinkOnly(true)
    .build();
Airbridge.init(this, config);

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

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

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

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

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

12345
dependencies {
    ...
    implementation 'com.facebook.android:facebook-android-sdk:latest.release'
    ...
}

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

12345
...
<string name="facebook_app_id">FACEBOOK_APP_ID</string>
<string name="facebook_client_token">FACEBOOK_CLIENT_TOKEN</string>
...

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

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

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

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

앱 삭제 추적 설정

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

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

위치 정보 수집 설정

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

주의하세요

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

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

주의하세요

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

앱 마켓별 유입량 측정 설정

광고주는 각각 마켓(GooglePlay Store, One Store, Huawei Store, Galaxy Store ...)에 대한 앱 설치 성과를 분석이 필요한 경우, 다음과 같이 각각의 마켓에 올라갈 앱들 대한 식별자 설정을 통하여 Airbridge 대시보드에서 구분지어 확인하실 수 있습니다.

AndroidManifest.xml을 통하여 설정하는 방법

android:value에 마켓 이름(playStoreoneStorehuaweiStoregalaxyStore)를 넣어줍니다.

1234567
...
<application android:label="@string/app_name" ...> 
    ...
    <meta-data android:name="co.ab180.airbridge.app_market_identifier" android:value="playStore"/>
    ...
</application>
...

AirbridgeConfig
를 통하여 설정하는 방법

setAppMarketIdentifier에 입력 값으로 마켓 이름(playStoreoneStorehuaweiStore)를 넣어줍니다.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setAppMarketIdentifier("playStore")
    .build();
Airbridge.init(this, config);

Actual Report의 Group By에서 Event Property > App Market Identifier 혹은 Raw Data Export (App)의 Group By에서 Event Property > App Market Identifier를 선택하여 데이터를 확인할 수 있습니다.

App Market Identifier 기준 설치 수

App Market Identifier 기준 설치 수

App Market Identifier 기준 설치 수

에러 로그 전송 허용 설정

에어브릿지 SDK에서는 품질 향상을 위해 SDK 내부 동작에서 의도치 않는 에러가 발생하는 경우, 해당 정보를 에어브릿지 서버에 전송하게 됩니다. 이를 원치 않으시는 경우, 다음과 같은 설정을 통해 에어브릿지 서버에 전송하지 않도록 설정할 수 있습니다.

12345
// Default Error Log Collection Enabled = true
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setErrorLogCollectionEnabled(false)
    .build();
Airbridge.init(this, config);

이벤트 버퍼 상한선 제한 설정

에어브릿지 SDK에서는 이벤트 버퍼를 통해 이벤트 데이터 전송을 관리합니다. 다음과 같은 설정을 통해 에어브릿지 이벤트 버퍼의 상한선을 제한할 수 있습니다.

1234567
int count = 10;
long bytes = 1000000L;
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setEventMaximumBufferCount(count)
    .setEventMaximumBufferSize(bytes)
    .build();
Airbridge.init(this, config);

이벤트 버퍼의 크기는 메타데이터 관리 등등으로 인하여 실제로 사용하는 데이터 크기 보다 약간 적습니다.

이벤트 전송 주기 설정

에어브릿지 SDK에서는 다음과 같은 처리를 통해 이벤트 전송 주기를 설정하는 기능을 추가할 수 있습니다.

12345
// Default Event Transmit Interval = 0 millisecond
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setEventTransmitInterval(3000)
    .build();
Airbridge.init(this, config);

주의하세요

Interval 타임으로 음수 값 입력 시 IllegalArgumentException(런타임 에러)가 발생됩니다.

세션 안에 발생한 생명 주기 이벤트 수집 설정

에어브릿지 SDK에서는 다음과 같은 처리를 통해 세션 안에 발생한 생명 주기 이벤트(ORGANIC_REOPENFOREGROUND)를 수집하도록 설정할 수 있습니다.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackInSessionLifeCycleEventEnabled(true)
    .build();
Airbridge.init(this, config);

미처리된 이벤트 삭제 설정

에어브릿지 SDK에서는 다음과 같은 처리를 통해 서버에 전송되지 못하여 디바이스 내부 DB에 저장된 이벤트들을 비워주는 기능을 추가할 수 있습니다.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setResetEventBufferEnabled(true)
    .build();
Airbridge.init(this, config);

앱에서 트래킹 링크 사용하기

주의하세요

에어브릿지의 Android SDK 2.18.0 이상에서 앱에서 트래킹 링크를 사용하면 타겟 이벤트 중에서 딥링크 페이지뷰(Deeplink Pageview)가 집계됩니다. 유저 여정에서 Deeplink Open 직후에 Deeplink Pageview가 발생하는 경우가 빈번하면 Deeplink Open 성과에 영향을 줄 수 있습니다.

Deeplink Pageview의 어트리뷰션 윈도우 기본 설정은 3일입니다. 딥링크 페이지뷰의 어트리뷰션 윈도우 변경을 원하는 고객사는 에어브릿지 CSM에게 문의해 주세요.

앱에서 트래킹 링크를 사용할 수 있습니다. 단, 커스텀 숏 ID를 사용하는 트래킹 링크는 앱에서 사용할 수 없습니다. 해당 기능을 사용하면 외부 브라우저를 거치지 않고 앱에서 같은 앱의 다른 페이지로 이동할 수 있습니다.

12
Airbridge.click("https://abr.ge/~~~")
Airbridge.impression("https://abr.ge/~~~")

click

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

impression

해당 트래킹 링크 가 UI에 표시 되었을 때 호출합니다. 그 후 트래킹 링크의 impression 통계를 1개 추가합니다.

메타 인스톨 리퍼러 수집 설정

메타 인스톨 리퍼러(Meta Install Referrer) 수집 설정은 안드로이드 SDK 2.22.3 버전 이상에서 사용할 수 있습니다. 아래 설정을 에어브릿지 SDK에 추가하면 메타 인스톨 리퍼러를 수집할 수 있습니다.

설정을 추가한 이후에 암호 해독 키를 에어브릿지 대시보드에 입력해야 복호화된 메타 인스톨 리퍼러를 확인할 수 있습니다. 암호 해독 키를 입력하는 방법은 에어브릿지 가이드를 참고해 주세요.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setMetaInstallReferrer("YOUR_FACEBOOK_APP_ID")
    .build();
Airbridge.init(this, config);

디지털 시장법(DMA) 준수를 위한 설정

디지털 시장법(DMA)를 준수하기 위해서는 유저 응답 정보(User Consent)를 에어브릿지에 전달해야 합니다. DMA와 적용 대상 등에 대한 자세한 내용은 에어브릿지 가이드를 참고해 주세요.

EEA(유럽 경제 지역)이라면 유저 응답 정보를 항상 에어브릿지에 전달해야 합니다.

1. 앱을 실행한 유저의 지역을 확인합니다. 유저가 앱을 실행한 지역이 EEA(eea=1)라면 기존에 수집한 유저 응답 정보가 있는지 확인합니다. 수집한 유저 응답 정보가 있다면 3번을 진행합니다.

유저가 앱을 실행한 지역이 EEA가 아니라면 유저 응답 정보를 수집하지 않아도 됩니다.

알립니다

에어브릿지는 유저 응답 정보 저장과 프롬프트 구현 방식 등에 관해 도움을 드릴 수 없습니다. 법률 자문사와 함께 검토해 주세요.

2. 수집한 유저 응답 정보가 없다면 프롬프트 등으로 유저 응답 정보를 수집합니다. 해당 단계에서 수집해야 하는 정보는 adPersonalization, adUserData입니다.

3. 에어브릿지 SDK를 초기화하고 유저 정보를 수집하기 전에 유저 응답 정보를 에어브릿지에 전달합니다.

주의하세요

아래를 주의해 주세요.

  • eea, adPersonalization, adUserData 이름을 동일하게 사용해야 합니다.

  • 수집한 정보에 맞게 0 또는 1을 입력해 주세요.

1234567891011121314151617181920
// MainApplication.kt
override fun onCreate() {
    super.onCreate()
    // Initialize Airbridge SDK
    val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        // Make Airbridge SDK explicitly start tracking
        .setAutoStartTrackingEnabled(false)
        .build()
    Airbridge.init(this, config)

    // Set device alias into Airbridge SDK
    // Based on actual region
    Airbridge.setDeviceAlias("eea", "0" or "1")

    // Based on actual user consent
    Airbridge.setDeviceAlias("adPersonalization", "0" or "1")
    Airbridge.setDeviceAlias("adUserData", "0" or "1")
    
    // Explicitly start tracking
    Airbridge.startTracking()

Attribution Result 콜백 설정

에어브릿지 SDK에서는 다음과 같은 처리를 통해 Attribution Result 데이터를 전달받을 수 있습니다.

123456789
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
	.setOnAttributionResultReceiveListener(new OnAttributionResultReceiveListener() {
		@Override
		public void onAttributionResultReceived(@NonNull Map<String, String> result) {
			// Process attribution data
		}
	})
	.build();
Airbridge.init(this, config);

  • Attribution Result 콜백을 통해 다음과 같은 데이터를 전달받을 수 있습니다.

필드명

설명

attributedChannel

채널 (String)

attributedCampaign

캠페인 (String)

attributedAdGroup

광고 그룹 (String)

attributedAdCreative

광고 소재 (String)

attributedContent

콘텐츠 (String)

attributedTerm

키워드 (String)

attributedSubPublisher

하위매체 (String)

attributedSubSubPublisher1

하하위매체 1 (String)

attributedSubSubPublisher2

하하위매체 2 (String)

attributedSubSubPublisher3

하하위매체 3 (String)

  • Unattributed 즉, 기여 결과가 없는 경우 Attribution Result 콜백을 통해 다음과 같은 데이터를 전달받습니다.

123
{
    "attributedChannel": "unattributed"
}

Attribution 값 사용에 대한 가이드라인:

  • 기여 결과가 존재하는 경우

    1. Attribution 값은 SDK 초기화 후 대체로 40초 내외에 콜백으로 전달됩니다.

    2. 앱이 종료되어 이전에 Attribution 값을 전달받지 못한 경우, 다음 앱 실행 시 SDK 초기화 후 40초 내외에 Attribution 값이 전달됩니다.

    3. 드물게 최대 5분까지 전달이 지연될 수 있습니다.

  • 기여 결과가 존재하지 않는 경우 SDK를 초기화한 이후, 최소 3시간이 경과한 후 앱 재실행 시 Attribution 값이 전달됩니다.

실시간 처리가 필요한 부분에는 콜백으로 전달되는 Attribution 값을 활용하는 것은 권장하지 않습니다.

Airbridge 비활성화 설정

에어브릿지 SDK에서는 다음과 같은 처리를 통해 에어브릿지의 모든 기능을 끄도록 설정할 수 있습니다.

1234
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setSdkEnabled(false)
    .build();
Airbridge.init(this, config);

"미처리된 이벤트 삭제 설정"과 "Airbridge 비활성화 설정"이 모두 설정된 경우, "Airbridge 비활성화 설정"이 우선되어지기 때문에 "미처리된 이벤트 삭제 설정"은 동작하지 않습니다.

하이브리드 앱 설정

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

주의하세요

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

WebView 환경 이벤트 전송

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

123456789101112131415161718192021
public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWebView();
    }
    
    void initWebView() {
        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/");
    }
}

해당 YOUR_WEB_SDK_TOKENAirbridge 대시보드Settings > Tokens 탭에서 확인하실 수 있습니다.

해당 설정이 완료 되면 실제 사용할 웹 페이지에서 이용가이드를 따라 Web SDK를 초기화해 주세요.

Troubleshooting

Ad ID permission

LAT(LimitAdTracking)를 비활성화한 상태에서 GAID가 00000000-0000-0000-0000-000000000000으로 잡히는 이슈

  1. AndroidManifest.xml 파일을 열어주세요.

  2. com.google.android.gms.permission.AD_ID 권한을 다음과 같이 추가해 주세요.

12345
<manifest ...>
  ...
  <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
  ...
</manifest>

더 자세한 내용은 구글 가이드를 참고해 주세요.

Braze push notification

Braze SDK 를 사용하여 push notification 을 통해 deeplink 를 open 할 시 airbridge 에서 event 가 DEEPLINK OPEN 이 안잡히고 OPEN 이 발생합니다. Airbridge SDK 는 event 확인을 위해서 activity 의 action 과 intent 의 dataString 으로 전달 되는 값을 통해 DEEPLINK OPEN ,OPEN 등을 판별 하고 있습니다. 그러나 Braze SDK 에 push notification 을 생성시 Braze SDK 에 정의 된 NotificationTrampolineActivity 을 통해서 open 되는데 해당 activity Action 과 intent 에서 dataString 값을 확인 할 수 없어서 발생하게 됩니다.

airbridge android SDK v2.21.5 에서 추가된 아래 interface 를 통해 해당 내용을 해결 할 수 있습니다.

123456789101112131415
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setLifecycleIntegration(new AirbridgeLifecycleIntegration() {
    @Nullable
    @Override
    public String getDataString(@NotNull Activity activity) {
      if (activity.getClass().getName().equals("com.braze.push.NotificationTrampolineActivity")
          && activity.getIntent() != null
          && activity.getIntent().getExtras() != null) {
        return activity.getIntent().getExtras().getString("uri");
      }
      return null;
    }
  })
    .build();
Airbridge.init(this, config)

deeplink.page 는 airbridge android SDK v2.21.1 버전에서 deprecated 되었습니다. 그렇지만 내부 동작을 통해 여전히 지원 및 동작은 되고 있습니다.

airbridge android SDK v2.21.0 이하 버전을 사용중이라면 하단에 명시된 절차에 따라서 Intent Filter를 설정해 주세요.

  1. AndroidManifest.xml 파일을 열어주세요.

  2. 딥링크를 처리할 Activity에 Intent Filter를 다음과 같이 추가해 주세요

12345678910111213141516171819202122232425262728
<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>

Dependencies

java.lang.NoClassDefFoundError: kotlin/coroutines/AbstractCoroutineContextKey 문제

Text
1234
java.lang.NoClassDefFoundError: kotlin/coroutines/AbstractCoroutineContextKey
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
  ...

@qwwdfsad에 따르면 kotlinx-coroutines-core 라이브러리 1.3.5 이상의 버전을 사용 시 반드시 kotlin-stdlib 라이브러리 버전 1.3.70 이상을 사용하도록 강제하고 있습니다.

gradlew dependencies 커멘드를 통해 현재 포함된 kotlinx-coroutines-core 라이브러리 버전이 1.3.5 이상인 경우 kotlin-stdlib 라이브러리 버전이 1.3.70 이상인지 확인해 주세요.

Auto Backup

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

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

에어브릿지 SDK에서 정의하는 Auto Backup Rules는 다음과 같습니다.

123456789
<?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="database" path="airbridge.db" />
</full-backup-content>

Double brace initialization Issue

12345678910111213141516171819202122232425262728293031
HashMap<String, Object> semanticAttributes = new HashMap();
semanticAttributes.put("products", Arrays.asList(
        // double brace initialization issue
        new HashMap<String, Object>() {{
            put("name", "MacBook Pro");
            put("price", 1548200);
            put("position", 1);
            put("brandID", 23);
            put("brandName", "apple");
        }},
        new HashMap<String, Object>() {{
            put("name", "MacBook Air");
            put("price", 1500000);
            put("position", 2);
            put("brandID", 23);
            put("brandName", "apple");
        }}
    )
);

HashMap<String, Object> customAttributes = new HashMap();
customAttributes.put("customKey", "customValue");

Airbridge.trackEvent(
    "purchase",
    "action",
    "label",
    3048200,
    customAttributes,
    semanticAttributes
);

Android SDK는 Google의 GSON 라이브러리를 사용중이며, 해당 라이브러리에 Double Brace Initialization 관련 Known Issue가 존재합니다. 하여 위 Java 코드와 같이 Products 객체를 만들때 Double Brace Initialization를 사용하면 products 데이터가 누락될 수 있기 때문에, 결제 완료의 예시 코드처럼 직접 Product 객체를 만들어 사용하시는 것을 권장드립니다.

마이그레이션 가이드


SDK 업데이트 시, `이전버전` ~ `이후버전` 사이에 해당하는 버전들에 해당하는 내용들을 고려해주세요.

2.24.0

2023년 9월 4일 이후에 생성된 에어브릿지 앱의 경우, 딥링크 콜백에서 제공하는 딥링크 URL 이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩하여 제공하는 문제가 v2.22.0 ~ v2.23.0 에 있었던 것이 해결되었습니다.

2.21.2

app 이 background 로 내려갔을 때, 이벤트 전송을 중지 하는 초기화 옵션이 추가 되었습니다.

  • AirbridgeConfig#setTransmitEventOnBackgroundEnabled 함수를 통해 app 이 background 로 내려갔을 때 event 전송을 중지 할 수 있습니다.

  • default 값은 true 로 background 에서도 남은 event 가 전송됩니다.

2.21.1

deeplink.page 가 deprecated 되었습니다. 2.21.1 부터는 abr.ge 로 딥링크 도메인을 사용 하여 코드를 작성 권장 드립니다

  • deeplink.page 는 하위 호환을 위해 여전히 지원 및 동작은 되고 있습니다.

2.19.1

세션 타임 이내에 발생된 ORGANIC_REOPEN, FOREGROUND 이벤트는 기본적으로 수집을 하지 않는 구조로 변경되었습니다.

  • 2.19.1 이전 버전을 사용 중 ORGANIC_REOPEN, FOREGROUND 이벤트를 수집하고 있다면 AirbridgeConfig#setTrackInSessionLifeCycleEventEnabled 을 통해 계속 해서 해당 이벤트를 수진 할 수 있습니다.

  • default 값은 false 로 ORGANIC_REOPEN, FOREGROUND이벤트를 수집을 하지 않습니다.

BACKGROUND이벤트가 제거되었습니다.

2.18.0

딥링크 이동에 대한 이벤트 기록이 Airbridge.click 호출의 경우에만 수집 될 수 있도록 변경 되었습니다.

도움이 되었나요?

더 필요한 내용이 있나요?