SDK 마이그레이션 가이드 - 안드로이드 SDK

에어브릿지 안드로이드 SDK를 업데이트하는 과정에 필요한 내용을 확인할 수 있습니다. 현재 버전 이후부터 업데이트 이후 버전까지의 내용을 모두 확인하는 것을 권장합니다.

v2.x에서 v4.0으로 업데이트

에어브릿지 안드로이드 SDK를 v4.0으로 업데이트하면 확인해 주세요. 아래에서 모든 변경사항을 확인할 수 있습니다.

Airbridge interface


Summary

Deprecated interface

Class 변경 사항


Added

Hidden

Removed

Moved

AirbridgeOption


SDK 초기화

Airbridge.init(Application, AirbridgeConfig)Airbridge.initializeSDK(Application, AirbridgeOption)으로 변경됐습니다.

AirbridgeConfigAirbridgeOption으로 변경됐습니다. AirbridgeConfig.BuilderAirbridgeOptionBuilder로 변경됐습니다. AirbridgeOptionBuilder에 있는 일부 함수 이름이 변경되거나 삭제됐습니다.

아래 예시를 참고해 주세요.

123456
override fun onCreate() {
    super.onCreate()
    val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        .build()
    Airbridge.initializeSDK(this, option)
}
1234567
@Override
public void onCreate() {
    super.onCreate();
    AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
        .build();
    Airbridge.initializeSDK(this, option);
}

딥링크

함수 이름이 getDeeplink()에서 handleDeeplink()로 변경되었습니다. AirbridgeCallback이 삭제 되고 OnSuccess, OnFailure listener가 추가되었습니다. return 값을 통해 해당 함수의 동작 여부를 확인할 수 있습니다.

12345
val result = Airbridge.handleDeeplink(
    intent = intent
    onSuccess = { },
    onFailure = { }
)
12345
boolean result = Airbridge.handleDeeplink(
        intent,
        uri -> { },
        throwable -> { }
);

listener을 추가하는 기존 디퍼드 딥링크 코드 로직을 더 편하게 화면 이동을 구현할 수 있도록 개선했습니다. listener을 추가하는 기존 방식은 삭제됐습니다. 대신 에어브릿지 인터페이스로 디퍼드 딥링크를 전달 받을 수 있습니다.

  • handleDeeplink 와 값을 activity 구성에서 호출할 수 있습니다.

  • result 값으로 디퍼드 딥링크를 처리할 수 있는 상태인지 확인할 수 있습니다.

  • 디퍼드 딥링크는 앱 설치 이후에 1번만 획득하도록 설계됐습니다. 값을 이미 획득했거나 먼저 호출하면 result는 false입니다.

1234
val result = Airbridge.handleDeferredDeeplink(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.handleDeferredDeeplink(
        uri -> { },
        throwable -> { }
);

커스텀 도메인 설정하기

v2.x 에서 사용 되던 커스텀 도메인 주소를 res/values/airbridge.xml 파일에 기록하는 방식이 변경되었습니다.

에어브릿지 SDK 초기화시 setTrackingLinkCustomDomains 함수를 사용하여 커스텀 도메인 링크를 추가 할 수 있습니다.

1234567
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
// YOUR_APP_CUSTOM_DOMAIN: input your app custom domain. ex) example.domain.com
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackingLinkCustomDomains(listOf("YOUR_APP_CUSTOM_DOMAIN"))
    .build()
Airbridge.initializeSDK(this, option)
1234567
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
// YOUR_APP_CUSTOM_DOMAIN: input your app custom domain. ex) example.domain.com
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
    .setTrackingLinkCustomDomains(Arrays.asList("YOUR_APP_CUSTOM_DOMAIN"))
    .build();
Airbridge.initializeSDK(this, option);

인앱 이벤트 및 유저 정보

아래 기존 API가 삭제되었습니다. 또한 StandardEventCategory, SemanticAttributes, Product가 삭제되었습니다.

  • trackEvent(category: StandardEventCategory, action: String? = null, label: String? = null, value: Number? = null, customAttributes: Map<String, Any?>? = null, semanticAttributes: Map<String, Any?>? = null)

  • trackEvent(category: String, action: String? = null, label: String? = null, value: Number? = null, customAttributes: Map<String, Any?>? = null, semanticAttributes: Map<String, Any?>? = null)

  • trackEvent(event: Event)

새로운 API 가 추가되었습니다.

  • trackEvent(category: String, semanticAttributes: Map<String, Any>? = null, customAttributes: Map<String, Any>? = null)

  • AirbridgeCategory가 추가되었습니다. event category string은 미리 정의되어 있습니다.

  • 기타 정보 전달을 위한 함수 override 와 객체(SemanticAttributes, Product)가 삭제됐습니다.

  • 대신 map 을 통해 어트리뷰트(attribute)을 전달하도록 수정되었습니다. map의 키 값은 AirbridgeAttribute에 string으로 미리 정의되어 있습니다. 커스텀 어트리뷰트는 string으로 직접하여 전달할 수 있습니다.

아래에서 AirbridgeCategory, AirbridgeAttribute 매핑과 trackEvent 함수를 참고해 주세요.

123456789101112131415161718192021222324252627
Airbridge.trackEvent(
    AirbridgeCategory.ORDER_COMPLETED,
    mapOf(
        // action
        AirbridgeAttribute.ACTION to "Tool",
        // label
        AirbridgeAttribute.LABEL to "Hammer",
        // value
        AirbridgeAttribute.VALUE to 10,
        // semantic attribute (provided by sdk)
        AirbridgeAttribute.CURRENCY to "USD",
        AirbridgeAttribute.PRODUCTS to listOf(
            mapOf(
                // semantic attribute value (provided by sdk)
                AirbridgeAttribute.PRODUCT_ID to "12345",
                // semantic attribute value (not provided by sdk)
                "name" to "PlasticHammer",
            ),
        ),
        // semantic attribute (not provided by sdk)
        "totalQuantity" to 1,
    ),
    mapOf(
        // custom attribute
        "promotion" to "FirstPurchasePromotion",
    )
)
12345678910111213141516171819202122232425262728
Airbridge.trackEvent(
        AirbridgeCategory.ORDER_COMPLETED,
        new HashMap() {{
            // action
            put(AirbridgeAttribute.ACTION, "Tool");
            // label
            put(AirbridgeAttribute.LABEL, "Hammer");
            // value
            put(AirbridgeAttribute.VALUE, 10);
            // semantic attribute (provided by sdk)
            put(AirbridgeAttribute.CURRENCY, "USD");
            put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
                new HashMap() {{
                    // semantic attribute value (provided by sdk)
                    put(AirbridgeAttribute.PRODUCT_ID, "12345");
                    // semantic attribute value (not provided by sdk)
                    put("name", "PlasticHammer");
                }}
            ));
            // semantic attribute (not provided by sdk)
            put("totalQuantity", 1);
            
        }},
        new HashMap() {{
            // custom attribute
            put("promotion", "FirstPurchasePromotion");
        }}
);

AirbridgeUser가 삭제되었습니다. 에어브릿지 인터페이스로 AirbridgeUser를 통해서 접근하는 인터페이스를 접근할 수 있습니다.

Airbridge.getUserInfo()를 통해서 접근하는 코드 대신 아래 에어브릿지 인터페이스로 교체해 사용해야 합니다.

123456789101112131415161718
fun setUserID(id: String)
fun setUserEmail(email: String)
fun setUserPhone(phone: String)

fun setUserAttribute(key: String, value: Int)
fun setUserAttribute(key: String, value: Long)
fun setUserAttribute(key: String, value: Float)
fun setUserAttribute(key: String, value: Double)
fun setUserAttribute(key: String, value: Boolean)
fun setUserAttribute(key: String, value: String)
fun removeUserAttribute(key: String)
fun clearUserAttributes()

fun setUserAlias(key: String, value: String)
fun removeUserAlias(key: String)
fun clearUserAlias()

fun clearUser()
123456789101112131415161718
void setUserID(String id)
void setUserEmail(String email)
void setUserPhone(String phone)

void setUserAttribute(String key, int value)
void setUserAttribute(String key, long value)
void setUserAttribute(String key, float value)
void setUserAttribute(String key, double value)
void setUserAttribute(String key, boolean value)
void setUserAttribute(String key, String value)
void removeUserAttribute(String key)
void clearUserAttributes()

void setUserAlias(String key, String value)
void removeUserAlias(key: String)
void clearUserAlias()

void clearUser()

AirbridgeDeviceInfo가 삭제되었습니다. AirbridgeDeviceInfo를 통해서 접근하던 인터페이스는 에어브릿지 인터페이스로 접근할 수 있도록 수정되었습니다.

AirbridgeCallback이 삭제되고 OnSuccess, OnFailure listener가 추가되었습니다. 해당 listener 를 통해 성공 여부를 전달 받을 수 있습니다.

Airbridge.getDeviceInfo()를 통해서 접근하는 코드 대신 아래 에어브릿지 인터페이스로 교체해서 사용해야 합니다.

Device UUID

1234
val result = Airbridge.fetchDeviceUUID(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchDeviceUUID(
        uuid -> { },
        throwable -> { }
    );

Install referrer

fetch Google Install referrer

1234
val result = Airbridge.fetchGoogleInstallReferrerDetails(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchGoogleInstallReferrerDetails(
        referrerDetails -> { },
        throwable -> { }
);

fetch Huawei Install referrer

1234
val result = Airbridge.fetchHuaweiInstallReferrerDetails(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchHuaweiInstallReferrerDetails(
        referrerDetails -> { },
        throwable -> { }
    );

fetch Galaxy store Install referrer

1234
val result = Airbridge.fetchGalaxyStoreInstallReferrerDetails(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchGalaxyStoreInstallReferrerDetails(
        referrerDetails -> { },
        throwable -> { }
    );

fetch Meta Install referrer

1234
val result = Airbridge.fetchMetaInstallReferrerDetails(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchMetaInstallReferrerDetails(
        referrerDetails -> { },
        throwable -> { }
    );

Advertising ID

fetch Google Advertising ID

1234
val result = Airbridge.fetchGoogleAdvertisingIdInfo(
    onSuccess = { },
    onFailure = { }
)
1234
boolean result = Airbridge.fetchGoogleAdvertisingIdInfo(
        advertisingIdInfo -> { },
        throwable -> { }
    );

fetch Huawei Advertising ID

1234
val result = Airbridge.fetchHuaweiAdvertisingIdInfo(
	onSuccess = { },
	onFailure = { }
)
1234
boolean result = Airbridge.fetchHuaweiAdvertisingIdInfo(
        advertisingIdInfo -> { },
        throwable -> { }
    );

AirbridgeDeviceInfo가 삭제되었습니다. 에어브릿지 인터페이스를 통해서 attribution result를 전달 받는 함수는 제공되지 않습니다. 다만, AirbridgeOption의 listener를 통해 전달 받을 수 있습니다. 기존에도 제공하는 방법입니다.

123456789101112
class App : Application() {

    override fun onCreate() {
        super.onCreate()
        val option: AirbridgeOption = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
            .setOnAttributionReceived { result ->
                // do something
            }
            .build()
        Airbridge.initializeSDK(this, option)
    }
}
123456789101112131415
class App extends Application {
    
    @Override
    public void onCreate() {
        super.onCreate();
        
        Airbridge.initializeSDK(this,
                new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
                        .setOnAttributionReceived(result -> {
                            // do something
                        })
                        .build()
                );
    }
}

AirbridgeCallback이 삭제되고 OnSuccess, OnFailure listener가 추가되었습니다. return 값을 통해 해당 함수의 동작 여부를 확인할 수 있습니다.

click

12345
fun click(
    trackingLink: String,
    onSuccess: OnSuccess<Unit>? = null,
    onFailure: OnFailure? = null
): Boolean
12345
boolean click(
    @NonNull String trackingLink,
    @Nullable OnSuccess<Unit> onSuccess,
    @Nullable OnFailure onFailure
)

impression

12345
fun impression(
    trackingLink: String,
    onSuccess: OnSuccess<Unit>? = null,
    onFailure: OnFailure? = null
): Boolean
12345
boolean impression(
    @NonNull String trackingLink,
    @Nullable OnSuccess<Unit> onSuccess,
    @Nullable OnFailure onFailure
)

하이브리드 연동

함수 이름이 setJavascriptInterface()에서 setWebInterface()로 변경되었습니다.

1
Airbridge.setWebInterface(webview, "YOUR_WEB_TOKEN")
1
Airbridge.setWebInterface(webview, "YOUR_WEB_TOKEN")

v2.x 업데이트

Android SDK 각 버전의 주요 변경사항을 참고해 주세요.

v2.24.0

2023년 9월 4일 이후 생성된 에어브릿지 앱은 딥링크 콜백에서 제공되는 딥링크 URL이 에어브릿지 대시보드에 입력된 내용을 2번 디코딩해 제공하는 문제를 해결했습니다.

해당 문제는 안드로이드 SDK v2.22.0 ~ v2.23.0에서 발생했습니다.

v2.21.2

앱이 background 상태에서 이벤트 전송을 중지하는 초기화 옵션이 추가되었습니다.

  • AirbridgeConfig#setTransmitEventOnBackgroundEnabled 함수로 앱이 background 상태에서 이벤트 중지를 설정할 수 있습니다.

  • 기본 값은 true입니다. true는 background 상태에서도 남은 이벤트를 전송합니다.

v2.21.1

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

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

v2.19.1

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

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

v2.18.0

딥링크 페이지뷰 이벤트가 Airbridge.click 호출의 경우에만 수집될 수 있도록 변경되었습니다.