알립니다
안드로이드 SDK v4 설치 및 설정에 대한 가이드입니다. 이전 버전은 안드로이드 SDK (v2) 가이드에서 확인해 주세요.
에어브릿지 안드로이드 SDK를 설치하고 필요한 설정을 추가할 수 있습니다.
에어브릿지 안드로이드 SDK는 아래 방법으로 설치할 수 있습니다. 설치한 이후에 안드로이드 SDK 테스트로 SDK가 정상적으로 설치됐는지 확인할 수 있습니다.
1. 프로젝트 build.gradle
파일의 repositories
블럭 안에 Airbridge maven 저장소를 선언합니다.
allprojects {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
allprojects {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
2. 어플리케이션 gradle
파일에서 Airbridge android SDK 패키지를 추가합니다.
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation "io.airbridge:sdk-android:HERE_LATEST_VERSION"
// For example
// implementation "io.airbridge:sdk-android:0.0.0"
}
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation("io.airbridge:sdk-android:HERE_LATEST_VERSION")
// For example
// implementation("io.airbridge:sdk-android:0.0.0")
}
알립니다
Kotlin stdlib 및 Kotlinx coroutines 라이브러리 버전이 1.4 이상이어야 합니다.
에어브릿지 안드로이드 SDK는 JetBrains의 Kotlin과 Coroutines 라이브러리를 함께 사용합니다.
.aar
을 통해 직접 설치하면 dependency 라이브러리를 프로젝트에 포함해야 합니다. 아래를 참고해 주세요.
알립니다
일반 SDK와 제한된 SDK 중에서 1가지 버전만 설치해 주세요.
정책, 환경 등에 따라 GAID, IDFA 같은 디바이스 ID 수집에 제한이 필요할 수 있습니다. 제한된 SDK(Restricted SDK)를 설치하면 에어브릿지 SDK가 GAID, IDFA 같은 디바이스ID를 수집하지 않습니다.
아래 방법에 따라 제한된 SDK를 설치해 주세요.
1. 프로젝트 build.gradle
파일의 repositories
블럭 안에 Airbridge maven 저장소를 선언합니다.
allprojects {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
allprojects {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
2. 어플리케이션 gradle
파일에서 Airbridge android SDK 패키지를 추가합니다.
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation "io.airbridge:sdk-android-restricted:HERE_LATEST_VERSION"
// For example
// implementation "io.airbridge:sdk-android-restricted:0.0.0"
}
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation("io.airbridge:sdk-android-restricted:HERE_LATEST_VERSION")
// For example
// implementation("io.airbridge:sdk-android-restricted:0.0.0")
}
알립니다
Kotlin stdlib 및 Kotlinx coroutines 라이브러리 버전이 1.4 이상이어야 합니다.
에어브릿지 안드로이드 SDK는 JetBrains의 Kotlin과 Coroutines 라이브러리를 함께 사용합니다.
.aar
을 통해 직접 설치하면 dependency 라이브러리를 프로젝트에 포함해야 합니다. 아래를 참고해 주세요.
에어브릿지 안드로이드 SDK를 Android Application class 내에서 초기화하는 것을 권장합니다.
1. Application class를 생성합니다.
import android.app.Application
class AndroidApplication: Application() {
override fun onCreate() {
super.onCreate()
}
}
import android.app.Application;
public class AndroidApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
}
2. 생성된 Application 을 AndroidManifest.xml
에 설정합니다.
<application
android:name=".AndroidApplication"
...>
3. Application class에서 Airbridge
를 가져옵니다.
import co.ab180.airbridge.Airbridge
import co.ab180.airbridge.Airbridge;
4. AndroidManifest.xml
에서 등록한 Application class 파일에 아래 코드를 추가합니다.
YOUR_APP_NAME과 YOUR_APP_TOKEN은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
override fun onCreate() {
super.onCreate()
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(this, option)
}
@Override
public void onCreate() {
super.onCreate();
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build();
Airbridge.initializeSDK(this, option);
}
주의하세요
initalizeSDK
함수를Application
클래스의onCreate
시점에 호출해야 올바르게 동작합니다.
5. 아래 권한을 설정합니다.
에어브릿지 안드로이드 SDK가 이벤트를 네트워크를 통해 전송할 수 있는 권한이 필요합니다.
아래 권한을 어플리케이션 AndroidManifest.xml
에 추가합니다.
<manifest ...>
...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
</manifest>
구글에 따르면 안드로이드 13(API 33) 이상을 대상으로 하는 앱은 디바이스의 광고 ID를 획득하기 위해 AndroidManifest.xml
파일에서 Google Play 서비스 일반 권한을 선언해야 합니다.
에어브릿지 안드로이드 SDK 는 V2.13.0 부터 광고 ID를 획득할 수 있는 AD_ID 권한을 자동으로 추가합니다.
LAT(LimitAdTracking)를 설정하지 않았는데 GAID가 00000000-0000-0000-0000-000000000000으로 발생하면 AD_ID 권한을 아래 코드로 추가해야 합니다. 다른 서드파티 라이브러리 등으로 인해 AD_ID 권한이 제외되어서 발생한 현상입니다.
<manifest ...>
...
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
...
</manifest>
알립니다
필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
옵트인(Opt-In)은 유저가 동의하기 전에 유저 정보를 사용하지 않는 정책입니다.
setAutoStartTrackingEnabled
함수를 false로 설정한 후에 이벤트를 수집할 수 있는 시점에 startTracking
함수를 호출합니다. startTracking
함수가 호출된 시점부터 이벤트를 수집합니다.
1. Application class 에서 초기화를 진행합니다. setAutoStartTrackingEnabled 함수로 초기화를 마친 후에 자동으로 이벤트 추적이 시작되지 않도록 설정합니다.
// Default Auto Start Tracking Enabled = true
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build()
Airbridge.initializeSDK(this, option)
// Default Auto Start Tracking Enabled = true
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build();
Airbridge.initializeSDK(this, option);
2. 개인정보 수집 및 활용에 대한 유저 응답을 수집합니다. 유저가 개인정보 수집 및 활용에 동의하면 이벤트 추적을 시작합니다.
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking()
}
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking();
}
알립니다
필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
옵트아웃(Opt-Out)은 유저가 거부하기 전에 유저 정보를 사용하는 정책입니다.
setAutoStartTrackingEnabled 설정을 true로 설정한 후에 이벤트를 수집할 수 없는 시점에 stopTracking 함수를 호출합니다. stopTracking 함수가 호출된 시점부터 이벤트를 수집하지 않습니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(true)
.build()
Airbridge.initializeSDK(this, option)
...
Airbridge.stopTracking()
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(true)
.build();
Airbridge.initializeSDK(this, option);
...
Airbridge.stopTracking();
알립니다
필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
SDK 시그니처(SDK Signature)로 SDK 스푸핑(SDK Spoofing)을 방지해 정확성과 안전성이 검증된 이벤트만 광고 성과 측정에 사용할 수 있습니다.
SDK 시그니처 설정에 SDK 시그니처 보안 정보가 필요합니다. SDK 시그니처 보안 정보에는 시크릿 ID와 시크릿이 있습니다. 필요한 SDK 시그니처 보안 정보는 에어브릿지 대시보드에서 확인할 수 있습니다. SDK 시그니처 보안 정보에 대한 자세한 내용은 에어브릿지 가이드를 참고해 주세요.
SDK 초기화 코드 위에서 setSDKSignature
함수를 호출해 SDK 시그니처를 설정할 수 있습니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSDKSignature("YOUR_SDK_SIGNATURE_SECRET_ID", "YOUR_SDK_SIGNATURE_SECRET")
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSDKSignature("YOUR_SDK_SIGNATURE_SECRET_ID", "YOUR_SDK_SIGNATURE_SECRET")
.build();
Airbridge.initializeSDK(this, option);
SDK 설정에 필요한 정보는 아래와 같습니다.
YOUR_APP_NAME: 에어브릿지 앱 이름. 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
YOUR_APP_SDK_TOKEN: 안드로이드 SDK 토큰. 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.
YOUR_SDK_SIGNATURE_SECRET_ID: 시크릿 ID. 에어브릿지 대시보드 [규칙 관리]>[광고사기 검증 규칙]>[SDK 시그니처]에서 확인할 수 있습니다.
YOUR_SDK_SIGNATURE_SECRET: 시크릿. 에어브릿지 대시보드 [규칙 관리]>[광고사기 검증 규칙]>[SDK 시그니처]에서 확인할 수 있습니다.
딥링크를 설정하면 트래킹 링크가 있는 광고를 클릭한 유저를 원하는 앱의 특정 페이지로 이동시킬 수 있습니다. 또한 트래킹 링크로 수집된 정보를 바탕으로 딥링크를 통해서 발생한 성과를 에어브릿지에서 확인할 수 있습니다.
에어브릿지는 트래킹 링크를 생성하면서 유저의 이동에 사용하는 스킴 딥링크(Scheme Deeplink)를 환경에 따라 최적의 에어브릿지 딥링크(Airbridge Deeplink)를 자동으로 선택해 활용합니다.
에어브릿지 딥링크: https://YOUR_APP_NAME.airbridge.io/~~~
스킴 딥링크: YOUR_SCHEME://product/12345
앱이 설치된 상태에서는 유저가 트래킹 링크를 열면 에어브릿지 딥링크로 앱이 열립니다. 에어브릿지 SDK가 해당 에어브릿지 딥링크를 트래킹링크에 설정된 스킴 딥링크로 변환합니다. 변환된 스킴 딥링크는 앱에 전달됩니다.
앱이 설치되어 있지 않은 상태에서는 유저가 트래킹 링크를 열면 에어브릿지 딥링크를 저장합니다. 앱스토어 또는 웹 사이트로 이동한 후에 앱이 설치된 이후 실행되면 에어브릿지 SDK가 저장된 에어브릿지 딥링크를 스킴 딥링크로 변환합니다. 변환된 스킴 딥링크는 앱에 전달됩니다.
딥링크를 설정합니다. 에어브릿지 대시보드에서 설정한 정보와 유저가 이동하는 목적지로 사용되는 앱 페이지 주소가 필요합니다.
먼저 에어브릿지에 딥링크 정보를 등록합니다.
에어브릿지 대시보드 [트래킹 링크]>[딥링크]에서 딥링크에 필요한 정보를 등록해야 합니다.
안드로이드 URI 스킴: 안드로이드 URI 스킴을 기준으로 에어브릿지 딥링크를 스킴 딥링크로 변환합니다. 앱 링크와 URI 스킴에 필요한 딥링크 정보입니다.
패키지 이름: 안드로이드 앱을 식별합니다. 앱 링크와 URI 스킴에 필요한 딥링크 정보입니다.
Android sha256_cert_fingerprints: 앱 링크 도메인을 설정하는 기준입니다. 앱 링크에 필요한 딥링크 정보입니다.
주의하세요
실제 출시 앱과 개발용 앱의 안드로이드 URI 스킴과 sha256_cert_fingerprints를 다르게 등록해야 유저를 정상적으로 이동 시킬 수 있습니다.
에어브릿지에 안드로이드 URI 스킴, 패키지 이름과 Android sha256_cert_fingerprints를 등록해 주세요.
1. 에어브릿지 대시보드의 [트래킹 링크]>[딥링크]로 이동합니다.
2. [안드로이드 URI 스킴]에 Android URI 스킴을 입력합니다. ://
와 함께 입력해야 합니다. 예를 들어 Android URI 스킴이 demo
면 demo://
와 같이 입력합니다.
3. [패키지 이름]에 패키지 이름을 입력합니다.
4. sha256_cert_fingerprints를 확인해야 합니다. 배포하는 keystore 파일에서 아래 명령을 실행합니다.
keytool -list -v -keystore YOUR_KEYSTORE.keystore
결과에서 SHA256 값을 확인합니다. SHA256 값이 sha256_cert_fingerprints입니다.
Certificate fingerprints:
MD5: 4C:65:04:52:F0:3F:F8:65:08:D3:71:86:FC:EF:C3:49
SHA1: C8:BF:B7:B8:94:EA:5D:9D:38:59:FE:99:63:ED:47:B2:D9:5A:4E:CC
SHA256: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99
5. [sha256_cert_fingerprints]에 확인한 SHA256 값을 입력합니다.
에어브릿지에 딥링크 정보를 등록한 후에 앱에 딥링크를 설정해야 합니다. 앱에서 딥링크를 위해 필요한 개발은 아래와 같습니다.
에어브릿지 딥링크로 앱이 실행되도록 설정합니다.
에어브릿지 딥링크로 유저를 이동시킵니다.
아래 내용을 참고해 주세요.
유저가 트래킹 링크를 클릭한 후에 앱이 에어브릿지 딥링크로 실행되도록 설정합니다.
1. 딥링크를 처리하는 Activity를 추가합니다. src에 Activity 클래스 파일을 추가합니다.
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class DeeplinkActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class DeeplinkActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
AndroidManifest.xml
파일에 Activity를 추가합니다.
<application
...>
<activity android:name=".DeeplinkActivity" />
</application>
2. 에어브릿지 딥링크의 스킴(Scheme) 딥링크 앱 설정이 필요합니다. AndroidManifest.xml
에 딥링크를 처리하는 Activity에 Intent Filter를 추가합니다.
추가하는 Intent Filter는 대시보드에 입력한 안드로이드 URI Scheme를 사용해야 합니다. ://
를 제외한 안드로이드 URI 스킴을 입력합니다.
<activity ...>
...
<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_SCHEME" />
</intent-filter>
...
</activity>
주의하세요
://
를 제외한 안드로이드 URI 스킴을 입력해야 합니다.
3. 에어브릿지 딥링크의 앱 링크(App Links) 앱 설정이 필요합니다. AndroidManifest.xml
에 딥링크를 처리하는 Activity 아래 Intent Filter를 추가합니다.
YOUR_APP_NAME
은 에어브릿지 앱 이름입니다.
<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>
...
</activity>
에어브릿지 딥링크가 실행되면 딥링크를 처리하는 Activity가 Airbridge.handleDeeplink
함수를 활용해 에어브릿지 딥링크를 스킴 딥링크로 변환합니다.
변환된 스킴 딥링크를 활용해 유저를 설정한 목적지로 보냅니다.
// when activity is opened with scheme deeplink or app links
override fun onResume() {
super.onResume()
// handle airbridge deeplink
val isHandled = Airbridge.handleDeeplink(intent) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
if (isHandled) return
// when app is opened with other deeplink
// use existing logic as it is
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
}
// when activity is opened with scheme deeplink or app links
@Override
protected void onResume() {
super.onResume();
boolean isHandled = Airbridge.handleDeeplink(
getIntent(),
uri -> {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
);
if (isHandled) return;
// when app is opened with other deeplink
// use existing logic as it is
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
Airbridge.handleDeeplink
함수는 에어브릿지 딥링크가 입력되면 true와 함께 변환된 스킴 딥링크를 onSuccess에 전달합니다. 에어브릿지 딥링크가 아니면 false와 함께 콜백을 제공하지 않습니다.
앱이 설치되지 않은 상태에서 디퍼드 딥링크를 설정한 트래킹 링크를 클릭하면 에어브릿지 딥링크를 저장합니다. 디퍼드 딥링크를 설정하면 에어브릿지 SDK는 아래와 같은 방식으로 딥링크를 획득합니다.
에어브릿지 SDK는 SDK 초기화 이후에 아래 조건을 모두 만족하면 딥링크 획득을 시도합니다. 획득 도중에 앱이 종료되면 에어브릿지 SDK는 저장된 에어브릿지 딥링크가 없는 것으로 처리합니다.
옵트인(Opt-In)을 설정한 상태에서 Airbridge.startTracking
함수를 호출합니다. 또는 옵트인을 설정하지 않았습니다.
Airbridge.handleDeferredDeeplink
함수는 저장된 에어브릿지 딥링크를 획득한 후에 스킴 딥링크로 변환해 앱에 전달합니다. 변환된 스킴 딥링크를 활용해 유저를 설정한 목적지로 보냅니다.
val isHandled = Airbridge.handleDeferredDeeplink {
// when app is opened with deferred deeplink
// show proper content using url
}
boolean isHandled = Airbridge.handleDeferredDeeplink(uri -> {
// when app is opened with deferred deeplink
// show proper content using url
});
Airbridge.handleDeferredDeeplink
함수는 앱이 설치되고 처음으로 호출되었으면 true를 반환하고, 에어브릿지 딥링크 획득을 기다려 스킴 딥링크로 변환해 onSuccess로 전달합니다. 해당 스킴 딥링크를 활용해 유저를 설정한 목적지로 보낼 수 있습니다.
또는 저장된 에어브릿지 딥링크가 없으면 null을 onSuccess 전달합니다. SDK가 초기화되지 않았거나 Airbridge.handleDeferredDeeplink
함수를 처음으로 호출하지 않았다면 false를 전달합니다.
전달되는 스킴 딥링크는 일반적으로 YOUR_SCHEME://...
형태의 URL입니다. 메타 디퍼드 앱 링크(Meta Deferred App Links) 같은 서비스를 이용하면 다른 형태의 URL이 전달될 수 있습니다.
에어브릿지 SDK가 서비스에서 발생한 유저의 특정 행동을 설정에 따라 수집한 후에 인앱 이벤트로 전송합니다.
하이브리드 앱 설정하기
하이브리드 앱에서 웹 사이트 코드를 변경하지 않아도 인앱 웹 사이트에서 발생하는 에어브릿지 관련 작업을 안드로이드 SDK가 처리하도록 설정할 수 있습니다.
이벤트를 전송하기 위해서는 trackEvent
메소드를 사용합니다. trackEvent
메소드를 사용하기 위해 Airbridge를 호출합니다.
import co.ab180.airbridge.Airbridge
import co.ab180.airbridge.Airbridge;
에어브릿지가 미리 정의한 카테고리 이름과 어트리뷰트를 사용하기 위해서는 AirbridgeCategory, AirbridgeAttribute
를 호출해야 합니다.
import co.ab180.airbridge.common.AirbridgeCategory
import co.ab180.airbridge.common.AirbridgeAttribute
import co.ab180.airbridge.common.AirbridgeCategory;
import co.ab180.airbridge.common.AirbridgeAttribute;
trackEvent
함수 구성요소의 필수 여부와 타입은 아래와 같습니다.
fun trackEvent(
category: String,
semanticAttributes: Map<String, Any?>? = null,
customAttributes: Map<String, Any?>? = null
)
void trackEvent(@NonNull String category)
void trackEvent(
@NonNull String category,
@Nullable Map<String, Any?> semanticAttributes
)
void trackEvent(
@NonNull String category,
@Nullable Map<String, Any?> semanticAttributes
@Nullable Map<String, Any?> customAttributes
)
이름 | 필수 여부 | 타입 | 설명 |
---|---|---|---|
category | 필수 | String | 이벤트의 이름 |
semanticAttributes | 선택 | Map<String, Any?> | 이벤트의 시멘틱 어트리뷰트 |
customAttributes | 선택 | Map<String, Any?> | 이벤트의 커스텀 어트리뷰트 |
각 구성요소의 정의와 사용할 수 있는 문자열을 아래에서 확인해 주세요.
AirbridgeCategory에서 에어브릿지 SDK가 제공하는 스탠다드 이벤트 카테고리를 확인할 수 있습니다. 또는 스탠다드 이벤트 목록에서 확인한 이벤트 카테고리를 입력합니다.
커스텀 이벤트는 이벤트 택소노미에서 정한 이벤트 이름을 입력하면 전송할 수 있습니다.
아래 예시를 참고해 주세요.
// track standard event (provided by sdk)
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED)
// track standard event (not provided by sdk)
Airbridge.trackEvent("airbridge.ecommerce.order.canceled")
// track custom event
Airbridge.trackEvent("eventViewed")
// track standard event (provided by sdk)
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED);
// track standard event (not provided by sdk)
Airbridge.trackEvent("airbridge.ecommerce.order.canceled");
// track custom event
Airbridge.trackEvent("eventViewed");
주의하세요
에어브릿지 SDK v4의 어트리뷰트는 이전 버전과 다릅니다. 이전 버전의 어트리뷰트에는 액션, 라벨, 밸류가 포함되지 않습니다.
어트리뷰트로 이벤트의 추가 정보를 수집할 수 있습니다.
액션, 라벨: 에어브릿지 리포트에서 그룹바이로 활용할 수 있는 정보를 수집합니다.
밸류: 매출 분석에 활용하는 정보를 수집합니다. 수집한 데이터는 자유롭게 사칙연산에 활용할 수 있습니다.
시맨틱 어트리뷰트: 에어브릿지가 미리 정의한 어트리뷰트입니다.
커스텀 어트리뷰트: 에어브릿지 사용자가 정의한 어트리뷰트입니다.
Airbridge.trackEvent
함수의 semanticAttributes 파라미터를 통해 액션, 라벨, 벨류, 시멘틱 어트리뷰트를 입력하고 customAttributes 파라미터를 통해 커스텀 어트리뷰트를 입력할 수 있습니다.
에어브릿지가 제공하는 시맨틱 어트리뷰트 목록은 아래에서 확인할 수 있습니다.
아래 예시를 참고해 주세요.
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",
)
)
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");
}}
);
주의하세요
시멘틱 어트리뷰트와 커스텀 어트리뷰트는 JSON만 데이터 타입으로 허용합니다.
JSON 타입: String, Number, Boolean, Object<String, JSON>, Array<JSON>
시멘틱 어트리뷰트와 커스텀 어트리뷰트에 사용할 수 없는 타입: Struct, Class 등
SDK가 제공하는 스탠다드 이벤트 카테고리와 시맨틱 어트리뷰트는 아래와 같습니다.
키 | 타입 | 값 |
---|---|---|
SIGN_UP | String | airbridge.user.signup |
SIGN_IN | String | airbridge.user.signin |
SIGN_OUT | String | airbridge.user.signout |
HOME_VIEWED | String | airbridge.ecommerce.home.viewed |
PRODUCT_LIST_VIEWED | String | airbridge.ecommerce.productList.viewed |
SEARCH_RESULTS_VIEWED | String | airbridge.ecommerce.searchResults.viewed |
PRODUCT_VIEWED | String | airbridge.ecommerce.product.viewed |
ADD_PAYMENT_INFO | String | airbridge.addPaymentInfo |
ADD_TO_WISHLIST | String | airbridge.addToWishlist |
ADDED_TO_CART | String | airbridge.ecommerce.product.addedToCart |
INITIATE_CHECKOUT | String | airbridge.initiateCheckout |
ORDER_COMPLETED | String | airbridge.ecommerce.order.completed |
ORDER_CANCELED | String | airbridge.ecommerce.order.canceled |
START_TRIAL | String | airbridge.startTrial |
SUBSCRIBE | String | airbridge.subscribe |
UNSUBSCRIBE | String | airbridge.unsubscribe |
AD_IMPRESSION | String | airbridge.adImpression |
AD_CLICK | String | airbridge.adClick |
COMPLETE_TUTORIAL | String | airbridge.completeTutorial |
ACHIEVE_LEVEL | String | airbridge.achieveLevel |
UNLOCK_ACHIEVEMENT | String | airbridge.unlockAchievement |
RATE | String | airbridge.rate |
SHARE | String | airbridge.share |
SCHEDULE | String | airbridge.schedule |
SPEND_CREDITS | String | airbridge.spendCredits |
키 | 타입 | 값 |
---|---|---|
ACTION | String | action |
LABEL | String | label |
VALUE | String | value |
CURRENCY | String | currency |
ORIGINAL_CURRENCY | String | originalCurrency |
PRODUCTS | String | products |
PRODUCT_ID | String | productID |
PRODUCT_NAME | String | name |
PRODUCT_PRICE | String | price |
PRODUCT_QUANTITY | String | quantity |
PRODUCT_CURRENCY | String | currency |
PRODUCT_POSITION | String | position |
PRODUCT_CATEGORY_ID | String | categoryID |
PRODUCT_CATEGORY_NAME | String | categoryName |
PRODUCT_BRAND_ID | String | brandID |
PRODUCT_BRAND_NAME | String | brandName |
PERIOD | String | period |
IS_RENEWAL | String | isRenewal |
RENEWAL_COUNT | String | renewalCount |
PRODUCT_LIST_ID | String | productListID |
CART_ID | String | cartID |
TRANSACTION_ID | String | transactionID |
TRANSACTION_TYPE | String | transactionType |
TRANSACTION_PAIRED_EVENT_CATEGORY | String | transactionPairedEventCategory |
TRANSACTION_PAIRED_EVENT_TIMESTAMP | String | transactionPairedEventTimestamp |
TOTAL_QUANTITY | String | totalQuantity |
QUERY | String | query |
IN_APP_PURCHASED | String | inAppPurchased |
CONTRIBUTION_MARGIN | String | contributionMargin |
ORIGINAL_CONTRIBUTION_MARGIN | String | originalContributionMargin |
LIST_ID | String | listID |
RATE_ID | String | rateID |
RATE | String | rate |
MAX_RATE | String | maxRate |
ACHIEVEMENT_ID | String | achievementID |
SHARED_CHANNEL | String | sharedChannel |
DATE_TIME | String | datetime |
DESCRIPTION | String | description |
IS_REVENUE | String | isRevenue |
PLACE | String | place |
SCHEDULE_ID | String | scheduleID |
TYPE | String | type |
LEVEL | String | level |
SCORE | String | score |
AD_PARTNERS | String | adPartners |
IS_FIRST_PER_USER | String | isFirstPerUser |
아래 데이터 유형별 예시 코드를 참고해 주세요.
Airbridge.trackEvent(
"event",
mapOf(
AirbridgeAttribute.VALUE to 10,
),
mapOf(
"string" to "string",
"number" to 1000,
"boolean" to true,
"object" to mapOf("key" to "value"),
"array" to listOf("value"),
)
)
Airbridge.trackEvent(
"event",
new HashMap() {{
put(AirbridgeAttribute.VALUE, 10);
}},
new HashMap() {{
put("string", "string");
put("number", 1000);
put("boolean", true);
put("object", new HashMap() {{
put("key", "value");
}});
put("array", Arrays.asList(
"value"
));
}}
)
알립니다
설정하지 않아도 기본 설정이 적용되어 있습니다. 추가 설정 필요한지 검토한 후에 진행해 주세요.
전송하는 인앱 이벤트에 필요한 설정을 추가할 수 있습니다.
에어브릿지 SDK는 유저가 발생시키는 이벤트를 세션 단위로 지원합니다. 세션은 아래 조건 중 하나라도 만족하면 종료됩니다.
앱이 백그라운드로 이동 또는 앱이 종료됨
포어그라운드(Foreground) 상태에서 세션 만료
세션이 종료된 이후에 앱을 실행하거나 이벤트가 발생하면 새로운 세션이 시작됩니다.
기본 세션 만료 기간은 300초입니다. setSessionTimeout
함수를 활용하면 세션 만료 기간을 수정할 수 있습니다. 세션 만료 기간으로 최대 604,800초(7일)까지 설정할 수 있습니다.
// Default Session Timeout = 300 sec
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeout(300)
.build()
Airbridge.initializeSDK(this, option)
// Default Session Timeout = 300 sec
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeout(300)
.build();
Airbridge.initializeSDK(this, option);
에어브릿지 SDK는 수집한 이벤트를 저장한 후에 저장한 이벤트를 모두 전송할 때까지 이벤트를 불러옵니다. 전송에 성공한 이벤트는 제거됩니다.
기본 이벤트 전송 주기는 0초입니다. setEventTransmitInterval
함수를 이용하면 최대 86,400초(1일)까지 수정할 수 있습니다.
아래 예시를 참고해 주세요.
// Default Event Transmit Interval = 0 millisecond
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build()
Airbridge.initializeSDK(this, option)
// Default Event Transmit Interval = 0 millisecond
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build();
Airbridge.initializeSDK(this, option);
에어브릿지 SDK는 최대 이벤트 개수와 최대 이벤트 크기 제한을 초과하지 않아야 이벤트를 저장합니다. 초과한 이벤트는 버립니다.
기본 최대 이벤트 개수는 INT_MAX개입니다. 기본 최대 이벤트 크기는 1024 GiB(기비바이트)입니다. setEventBufferCountLimit
함수와 setEventBufferSizeLimit
함수로 수정할 수 있습니다. 최대로 설정할 수 있는 최대 이벤트 개수는 INT_MAX개입니다. 최대로 설정할 수 있는 최대 이벤트 크기는 1024 GiB(기비바이트)입니다.
아래 예시를 참고해 주세요.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferCountLimit(1_000)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferCountLimit(1000)
.build();
Airbridge.initializeSDK(this, option);
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferSizeLimit(1_000)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferSizeLimit(1000L)
.build();
Airbridge.initializeSDK(this, option);
이벤트 삭제 옵션을 활성화하면 에어브릿지 SDK 초기화 과정에서 전송되지 않고 저장된 인앱 이벤트를 모두 삭제합니다. 기본 이벤트 삭제 옵션은 비활성화입니다.
setClearEventBufferOnInitializeEnabled
함수를 true로 설정하면 이벤트 삭제 옵션이 활성화됩니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setClearEventBufferOnInitializeEnabled(true)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setClearEventBufferOnInitializeEnabled(true)
.build();
Airbridge.initializeSDK(this, option);
에어브릿지 SDK는 디바이스 식별자를 모든 이벤트에 포함해 전송하는 기능을 지원합니다.
함수 | 설명 |
---|---|
| 디바이스 식별자를 추가로 입력합니다. 최대 10개 입력할 수 있습니다. - key: 최대 128자입니다. - value: 최대 128자입니다. |
| 디바이스 식별자 중에서 지정한 디바이스 식별자를 삭제합니다. |
| 디바이스 식별자를 모두 삭제합니다. |
아래 예시를 참고해 주세요.
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE")
Airbridge.removeDeviceAlias("DELETE_THIS_KEY")
Airbridge.clearDeviceAlias()
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
Airbridge.clearDeviceAlias();
에어브릿지가 수집하는 주요 인앱 이벤트는 스탠다드 이벤트와 커스텀 이벤트입니다. 스탠다드 이벤트는 에어브릿지가 정의한 이벤트입니다. 아래 예시 코드를 참고해 주세요.
Airbridge.setUserID("string")
Airbridge.setUserAlias("string", "string")
Airbridge.setUserEmail("string")
Airbridge.setUserPhone("string")
Airbridge.setUserAttribute("string", "string")
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
)
Airbridge.setUserID("string");
Airbridge.setUserAlias("string", "string");
Airbridge.setUserEmail("string");
Airbridge.setUserPhone("string");
Airbridge.setUserAttribute("string", "string");
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
);
Airbridge.setUserID("string")
Airbridge.setUserAlias("string", "string")
Airbridge.setUserEmail("string")
Airbridge.setUserPhone("string")
Airbridge.setUserAttribute("string", "string")
Airbridge.trackEvent(
AirbridgeCategory.SIGN_IN
)
Airbridge.setUserID("string");
Airbridge.setUserAlias("string", "string");
Airbridge.setUserEmail("string");
Airbridge.setUserPhone("string");
Airbridge.setUserAttribute("string", "string");
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
);
Airbridge.trackEvent(
AirbridgeCategory.SIGN_OUT
)
Airbridge.clearUser()
Airbridge.trackEvent(
AirbridgeCategory.SIGN_OUT
);
Airbridge.clearUser();
Airbridge.trackEvent(
AirbridgeCategory.HOME_VIEWED
)
Airbridge.trackEvent(
AirbridgeCategory.HOME_VIEWED
);
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_LIST_VIEWED,
mapOf(
AirbridgeAttribute.LIST_ID to "84e6e236-38c4-48db-9b49-16e4cc064386",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_LIST_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.LIST_ID, "84e6e236-38c4-48db-9b49-16e4cc064386");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SEARCH_RESULTS_VIEWED,
mapOf(
AirbridgeAttribute.QUERY to "Plastic",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SEARCH_RESULTS_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.QUERY, "Plastic");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_VIEWED,
mapOf(
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADD_PAYMENT_INFO,
mapOf(
AirbridgeAttribute.TYPE to "CreditCard",
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADD_PAYMENT_INFO,
new HashMap() {{
put(AirbridgeAttribute.TYPE, "CreditCard");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADD_TO_WISHLIST,
mapOf(
AirbridgeAttribute.LIST_ID to "189a2f8b-83ee-4074-8158-726be54e57d4",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADD_TO_WISHLIST,
new HashMap() {{
put(AirbridgeAttribute.LIST_ID, "189a2f8b-83ee-4074-8158-726be54e57d4");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADDED_TO_CART,
mapOf(
AirbridgeAttribute.CART_ID to "421eaeb7-6e80-4694-933e-f2e1a55e9cbd",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADDED_TO_CART,
new HashMap() {{
put(AirbridgeAttribute.CART_ID, "421eaeb7-6e80-4694-933e-f2e1a55e9cbd");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.INITIATE_CHECKOUT,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "0a7ee1ec-33da-4ffb-b775-89e80e75978a",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.INITIATE_CHECKOUT,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "0a7ee1ec-33da-4ffb-b775-89e80e75978a");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
mapOf(
AirbridgeAttribute.VALUE to 11,
AirbridgeAttribute.TRANSACTION_ID to "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.IN_APP_PURCHASED to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 11);
put(AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.IN_APP_PURCHASED, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ORDER_CANCELED,
mapOf(
AirbridgeAttribute.VALUE to 11,
AirbridgeAttribute.TRANSACTION_ID to "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.IN_APP_PURCHASED to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ORDER_CANCELED,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 11);
put(AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.IN_APP_PURCHASED, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.START_TRIAL,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "ef1e5271-0370-407c-b1e9-669a8df1dc2c",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PERIOD to "P1M",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.START_TRIAL,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "ef1e5271-0370-407c-b1e9-669a8df1dc2c");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PERIOD, "P1M");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SUBSCRIBE,
mapOf(
AirbridgeAttribute.VALUE to 15,
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.TRANSACTION_ID to "cbe718c7-e44e-4707-b5cd-4a6a29f29649",
AirbridgeAttribute.PERIOD to "P1M",
AirbridgeAttribute.IS_RENEWAL to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SUBSCRIBE,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 15);
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649");
put(AirbridgeAttribute.PERIOD, "P1M");
put(AirbridgeAttribute.IS_RENEWAL, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.UNSUBSCRIBE,
mapOf(
AirbridgeAttribute.VALUE to 15,
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.TRANSACTION_ID to "cbe718c7-e44e-4707-b5cd-4a6a29f29649",
AirbridgeAttribute.IS_RENEWAL to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.UNSUBSCRIBE,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 15);
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649");
put(AirbridgeAttribute.IS_RENEWAL, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.AD_IMPRESSION,
mapOf(
AirbridgeAttribute.VALUE to 0.01,
AirbridgeAttribute.AD_PARTNERS to mapOf(
"mopub" to mapOf(
"app_version" to "5.18.0",
"adunit_id" to "12345",
"adunit_name" to "12345",
"adunit_format" to "Banner",
"id" to "12345",
"currency" to "USD",
"publisher_revenue" to 12345.123,
"adgroup_id" to "12345",
"adgroup_name" to "12345",
"adgroup_type" to "12345",
"adgroup_priority" to "12345",
"country" to "kr",
"precision" to "publisher_defined",
"network_name" to "12345",
"network_placement_id" to "12345",
"demand_partner_data" to "12345",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.AD_IMPRESSION,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 0.01);
put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
put("mopub", new HashMap() {{
put("app_version", "5.18.0");
put("adunit_id", "12345");
put("adunit_name", "12345");
put("adunit_format", "Banner");
put("id", "12345");
put("currency", "USD");
put("publisher_revenue", 12345.123);
put("adgroup_id", "12345");
put("adgroup_name", "12345");
put("adgroup_type", "12345");
put("adgroup_priority", "12345");
put("country", "kr");
put("precision", "publisher_defined");
put("network_name", "12345");
put("network_placement_id", "12345");
put("demand_partner_data", "12345");
}});
}});
}}
);
Airbridge.trackEvent(
AirbridgeCategory.AD_CLICK,
mapOf(
AirbridgeAttribute.VALUE to 0.1,
AirbridgeAttribute.AD_PARTNERS to mapOf(
"mopub" to mapOf(
"app_version" to "5.18.0",
"adunit_id" to "12345",
"adunit_name" to "12345",
"adunit_format" to "Banner",
"id" to "12345",
"currency" to "USD",
"publisher_revenue" to 12345.123,
"adgroup_id" to "12345",
"adgroup_name" to "12345",
"adgroup_type" to "12345",
"adgroup_priority" to "12345",
"country" to "kr",
"precision" to "publisher_defined",
"network_name" to "12345",
"network_placement_id" to "12345",
"demand_partner_data" to "12345",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.AD_CLICK,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 0.1);
put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
put("mopub", new HashMap() {{
put("app_version", "5.18.0");
put("adunit_id", "12345");
put("adunit_name", "12345");
put("adunit_format", "Banner");
put("id", "12345");
put("currency", "USD");
put("publisher_revenue", 12345.123);
put("adgroup_id", "12345");
put("adgroup_name", "12345");
put("adgroup_type", "12345");
put("adgroup_priority", "12345");
put("country", "kr");
put("precision", "publisher_defined");
put("network_name", "12345");
put("network_placement_id", "12345");
put("demand_partner_data", "12345");
}});
}});
}}
);
Airbridge.trackEvent(
AirbridgeCategory.COMPLETE_TUTORIAL,
mapOf(
AirbridgeAttribute.DESCRIPTION to "Finish Initial Tutorial",
)
)
Airbridge.trackEvent(
AirbridgeCategory.COMPLETE_TUTORIAL,
new HashMap() {{
put(AirbridgeAttribute.DESCRIPTION, "Finish Initial Tutorial");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ACHIEVE_LEVEL,
mapOf(
AirbridgeAttribute.LEVEL to 13,
)
)
Airbridge.trackEvent(
AirbridgeCategory.ACHIEVE_LEVEL,
new HashMap() {{
put(AirbridgeAttribute.LEVEL, 13);
}}
);
Airbridge.trackEvent(
AirbridgeCategory.UNLOCK_ACHIEVEMENT,
mapOf(
AirbridgeAttribute.ACHIEVEMENT_ID to "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1",
AirbridgeAttribute.DESCRIPTION to "Get Score Over 50",
AirbridgeAttribute.SCORE to 80,
)
)
Airbridge.trackEvent(
AirbridgeCategory.UNLOCK_ACHIEVEMENT,
new HashMap() {{
put(AirbridgeAttribute.ACHIEVEMENT_ID, "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1");
put(AirbridgeAttribute.DESCRIPTION, "Get Score Over 50");
put(AirbridgeAttribute.SCORE, 80);
}}
);
Airbridge.trackEvent(
AirbridgeCategory.RATE,
mapOf(
AirbridgeAttribute.RATE_ID to "531c64b3-4704-4780-a306-89014ec18daf",
AirbridgeAttribute.RATE to 4.5,
AirbridgeAttribute.MAX_RATE to 5,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.RATE,
new HashMap() {{
put(AirbridgeAttribute.RATE_ID, "531c64b3-4704-4780-a306-89014ec18daf");
put(AirbridgeAttribute.RATE, 4.5);
put(AirbridgeAttribute.MAX_RATE, 5);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SHARE,
mapOf(
AirbridgeAttribute.DESCRIPTION to "Share Promotion",
AirbridgeAttribute.SHARED_CHANNEL to "CopyLink",
)
)
Airbridge.trackEvent(
AirbridgeCategory.SHARE,
new HashMap() {{
put(AirbridgeAttribute.DESCRIPTION, "Share Promotion");
put(AirbridgeAttribute.SHARED_CHANNEL, "CopyLink");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SCHEDULE,
mapOf(
AirbridgeAttribute.SCHEDULE_ID to "75712915-2cd9-4e42-a85e-8d42f356f4c6",
AirbridgeAttribute.DATE_TIME to "2024-01-01T00:00:00+00:00",
AirbridgeAttribute.PLACE to "ConferenceRoom",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "abb3e65d-17bc-4b28-89e3-5e356c0ea697",
AirbridgeAttribute.PRODUCT_NAME to "ConferenceRoom",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SCHEDULE,
new HashMap() {{
put(AirbridgeAttribute.SCHEDULE_ID, "75712915-2cd9-4e42-a85e-8d42f356f4c6");
put(AirbridgeAttribute.DATE_TIME, "2024-01-01T00:00:00+00:00");
put(AirbridgeAttribute.PLACE, "ConferenceRoom");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "abb3e65d-17bc-4b28-89e3-5e356c0ea697");
put(AirbridgeAttribute.PRODUCT_NAME, "ConferenceRoom");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SPEND_CREDITS,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "22eb193d-be11-4fe4-95da-c91a196faf1c",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SPEND_CREDITS,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "22eb193d-be11-4fe4-95da-c91a196faf1c");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
커스텀 이벤트는 앱 서비스에 맞는 광고 성과를 추적하기 위해 스탠다드 이벤트에 해당하지 않는 유저의 행동을 새로 정의한 이벤트입니다. 아래 예시 코드를 참고해 주세요.
Airbridge.trackEvent(
"event",
mapOf(
AirbridgeAttribute.VALUE to 10,
),
mapOf(
"string" to "string",
"number" to 1000,
"boolean" to true,
"object" to ["key": "value"],
"array" to ["value"],
)
)
Airbridge.trackEvent(
"event",
new HashMap() {{
put(AirbridgeAttribute.VALUE, 10);
}},
new HashMap() {{
put("string", "string");
put("number", 1000);
put("boolean", true);
put("object", new HashMap() {{
put("key", "value");
}});
put("array", Arrays.asList(
"value",
));
}}
);
유저 정보를 이벤트 포함해 전송합니다. 해당 유저 정보를 바탕으로 웹과 앱에서 발생한 광고 성과를 더 정확하게 분석할 수 있습니다.
유저 ID는 서비스에서 활용하는 유저 식별자입니다. 유저 ID는 유저를 웹과 앱에서 하나의 유저로 특정할 수 있는 고유한 ID이어야 합니다.
함수 |
설명 |
---|---|
| 유저 ID를 입력합니다. |
| 유저 ID를 삭제합니다. |
| 유저 식별자를 추가로 입력합니다. 최대 10개 입력할 수 있습니다. - key: 최대 128자입니다. - value: 최대 1024자입니다. |
| 추가로 입력한 유저 식별자 중에서 지정한 식별자를 삭제합니다. |
| 추가로 입력한 모든 유저 식별자를 삭제합니다. |
아래 예시를 참고해 주세요.
// ID
Airbridge.setUserID("testID")
// alias
Airbridge.setUserAlias("ADD_YOUR_KEY", "value")
Airbridge.removeUserAlias("DELETE_THIS_KEY")
Airbridge.clearUserAlias()
// ID
Airbridge.setUserID("testID");
// alias
Airbridge.setUserAlias("ADD_YOUR_KEY", "value");
Airbridge.removeUserAlias("DELETE_THIS_KEY");
Airbridge.clearUserAlias();
주의하세요
민감한 유저 정보가 포함될 수 있습니다. 법률 자문사와 충분히 검토한 후에 전송해 주세요.
유저 속성을 설정하면 추가 유저 정보를 전송할 수 있습니다.
함수 |
설명 |
---|---|
| 유저 이메일을 입력합니다. SHA256으로 해시(Hash)화되어 있습니다. |
| 유저 이메일을 삭제합니다. |
| 유저 전화 번호를 입력합니다. SHA256으로 해시화되어 있습니다. |
| 유저 전화 번호를 삭제합니다. |
| 유저 속성을 추가로 입력합니다. 최대 100개 입력할 수 있습니다. - key: 최대 128자입니다. - value: String, Number, Boolean 타입만 지원합니다. 최대 1024자입니다. |
| 추가로 입력한 유저 속성 중에서 지정한 속성을 삭제합니다. |
| 추가로 입력한 모든 유저 속성을 삭제합니다. |
아래 예시를 참고해 주세요.
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.setUserEmail("testID@ab180.co")
Airbridge.setUserPhone("821012341234")
// attributes
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1L)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1f)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1.0)
Airbridge.setUserAttribute("ADD_YOUR_KEY", "1")
Airbridge.setUserAttribute("ADD_YOUR_KEY", true)
Airbridge.removeUserAttribute("DELETE_THIS_KEY")
Airbridge.clearUserAttributes()
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.setUserEmail("testID@ab180.co");
Airbridge.setUserPhone("821012341234");
// attributes
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1L);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1f);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1.0);
Airbridge.setUserAttribute("ADD_YOUR_KEY", "1");
Airbridge.setUserAttribute("ADD_YOUR_KEY", true);
Airbridge.removeUserAttribute("DELETE_THIS_KEY");
Airbridge.clearUserAttributes();
setHashUserInformationEnabled
함수를 false로 설정하면 유저 이메일과 전화번호를 해시화하지 않고 전송합니다. 기본 설정은 true입니다.
// Default User Info Hash Enabled = true
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setHashUserInformationEnabled(false)
.build()
Airbridge.initializeSDK(this, option)
// Default User Info Hash Enabled = true
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setHashUserInformationEnabled(false)
.build();
Airbridge.initializeSDK(this, option);
Airbridge.clearUser
함수로 유저 정보를 초기화할 수 있습니다.
Airbridge.clearUser()
Airbridge.clearUser();
안드로이드 SDK를 추가로 설정할 수 있습니다.
알립니다
필수 설정 기능이 아닙니다. 필요한 기능인지 확인한 후에 설정해 주세요.
링크를 여는 방식에 따라 인앱에서 해당 앱의 트래킹 링크를 정상적으로 활용하기 어려울 수 있습니다.
Airbridge.click
함수 또는 Airbridge.impression
함수를 이용하면 인앱에서 외부 브라우저를 거치지 않고 트래킹 링크를 정상적으로 활용할 수 있습니다. 숏 링크 ID를 설정한 커스텀 채널용 트래킹 링크는 지원하지 않습니다.
유저가 인앱에서 트래킹 링크를 클릭하면 Airbridge.click
함수를 호출합니다. 해당 함수를 호출하면 트래킹 링크 설정에 따라 스킴 딥링크를 전달하거나 앱마켓, 웹 사이트로 보냅니다.
fun click(
trackingLink: String,
onSuccess: OnSuccess<Unit>? = null,
onFailure: OnFailure? = null
): Boolean
boolean click(
@NonNull String trackingLink,
@Nullable OnSuccess<Unit> onSuccess,
@Nullable OnFailure onFailure
)
유저가 트래킹 링크에 노출되면 Airbridge.impression
함수를 호출합니다. 해당 함수를 호출하면 노출(Impression) 이벤트를 수집합니다.
fun impression(
trackingLink: String,
onSuccess: OnSuccess<Unit>? = null,
onFailure: OnFailure? = null
): Boolean
boolean impression(
@NonNull String trackingLink,
@Nullable OnSuccess<Unit> onSuccess,
@Nullable OnFailure onFailure
)
주의하세요
에어브릿지의 안드로이드 SDK v2.18.0 이상에서 인앱에서 트래킹 링크 활용하기를 설정하면 앱에서 트래킹 링크를 사용할 때마다 딥링크 페이지뷰(Deeplink Pageview)가 타겟 이벤트로 집계됩니다. 딥링크 실행(Deeplink Open) 직후에 딥링크 페이지뷰가 빈번하게 발생하면 딥링크 실행 성과에 영향을 줄 수 있습니다.
딥링크 페이지뷰의 어트리뷰션 윈도우 기본 설정은 3일입니다. 딥링크 페이지뷰의 어트리뷰션 윈도우 변경을 원하는 고객사는 에어브릿지 CSM에게 문의해 주세요.
주의하세요
에어브릿지 SDK가 어트리뷰션 결과를 수집하는데 시간이 필요합니다. 실시간 처리가 필요한 기능에 어트리뷰션 결과를 활용하는 것을 권장하지 않습니다.
setOnAttributionReceived
함수로 설치 이벤트에 대한 어트리뷰션 결과를 받을 수 있습니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnAttributionReceived(object : OnAttributionResultReceiveListener {
override fun onAttributionResultReceived(result: Map<String, String>) {
// Process attribution data
}
})
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnAttributionReceived(new OnAttributionResultReceiveListener() {
@Override
public void onAttributionResultReceived(@NonNull Map<String, String> result) {
// Process attribution data
}
})
.build();
Airbridge.initializeSDK(application, option);
어트리뷰션 결과 존재 여부에 따라 아래와 같이 값이 전달됩니다.
Attribution Result callback 을 통해 아래 데이터를 확인할 수 있습니다. 전달 되는 데이터는 map 으로 전달 됩니다.
어트리뷰션 결과는 SDK 초기화 이후 1분 이내에 콜백으로 전달됩니다. 앱이 종료되어 전달되지 않은 이전 어트리뷰션 결과는 다음에 앱을 실행하면 1분 이내에 콜백으로 전달됩니다. 네트워크 환경 등에 따라 최대 5분까지 지연될 수 있습니다.
키 | 타입 | 설명 |
---|---|---|
attributedChannel | String | Channel |
attributedCampaign | String | 캠페인 |
attributedAdGroup | String | 광고 그룹 |
attributedAdCreative | String | 광고 소재 |
attributedContent | String | 콘텐츠 |
attributedTerm | String | 키워드 |
attributedSubPublisher | String | 하위매체 |
attributedSubSubPublisher1 | String | 하하위매체 1 |
attributedSubSubPublisher2 | String | 하하위매체 2 |
attributedSubSubPublisher3 | String | 하하위매체 3 |
기여 결과가 없으면 아래 데이터를 확인할 수 있습니다. SDK 초기화 기준 최소 3시간이 지나고 앱을 다시 실행해야 어트리뷰션 결과가 없다는 정보가 전달됩니다.
{
"attributedChannel": "unattributed"
}
에어브릿지 SDK는 딥링크를 생성한 서비스와 관계 없이 딥링크로 앱이 실행되면 딥링크 이벤트를 수집합니다. 딥링크 이벤트가 과도하게 수집되면 setTrackAirbridgeDeeplinkOnlyEnabled
함수를 true로 설정해 에어브릿지 딥링크만 수집할 수 있습니다.
// Default Track Airbridge Link Only = false
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeDeeplinkOnlyEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
// Default Track Airbridge Link Only = false
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeDeeplinkOnlyEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
에어브릿지 SDK는 새로운 세션을 시작하는 실행(Open), 포그라운드(Foreground) 이벤트는 수집합니다. 세션이 유지되는 중에는 해당 이벤트를 수집하지 않습니다.
setTrackInSessionLifeCycleEventEnabled
함수를 true로 설정하면 세션이 유지되는 중에 실행(Open), 포그라운드(Foreground) 이벤트를 수집할 수 있습니다.
수집된 포그라운드(Foreground) 이벤트는 모두 실행(Open) 이벤트로 기록됩니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
디지털 시장법(DMA)를 준수하기 위해서는 유저 응답 정보(User Consent)를 에어브릿지에 전달해야 합니다. DMA와 적용 대상 등에 대한 자세한 내용은 에어브릿지 가이드를 참고해 주세요.
EEA(유럽 경제 지역)이라면 유저의 유럽 경제 지역 여부와 유저 응답 정보를 항상 에어브릿지에 전달해야 합니다.
1. 앱을 실행한 유저의 지역을 확인합니다. 유저가 앱을 실행한 지역이 EEA(eea=1)
라면 기존에 수집한 유저 응답 정보가 있는지 확인합니다. 수집한 유저 응답 정보가 있다면 3번을 진행합니다.
유저가 앱을 실행한 지역이 EEA가 아니라면 유저 응답 정보를 수집하지 않아도 됩니다.
알립니다
에어브릿지는 유저 응답 정보 저장과 프롬프트 구현 방식 등에 관해 도움을 드릴 수 없습니다. 법률 자문사와 함께 검토해 주세요.
2. 수집한 유저 응답 정보가 없다면 프롬프트 등으로 유저 응답 정보를 수집합니다. 해당 단계에서 수집해야 하는 정보는 adPersonalization
, adUserData
입니다.
주의하세요
2024년 3월 6일부터 EEA 지역에 있는 기존 유저와 신규 유저에 대한 유저 응답 정보를 최소 1번이라도 수집해야 합니다.
에어브릿지에 전달해야 하는 유저 응답 정보는 아래와 같습니다. eea
는 유저가 응답한 정보 또는 에어브릿지가 자동으로 수집하는 정보가 아닙니다. 유저가 있는 지역에 따라 결정한 eea
값을 전달해 주세요.
에어브릿지 필드 이름 |
구글 필드 이름 |
설명 |
---|---|---|
<string> |
| 디지털 시장법(DMA)를 준수해야 하는 지역에 대한 정보. 유저가 응답한 정보 또는 에어브릿지가 자동으로 수집하는 정보가 아닙니다. 유저가 있는 지역에 따라 알맞게 전송해 주세요.
- - |
<string> |
| 개인 맞춤형 광고(Personalized Ads) 제공을 위한 정보 수집에 대한 동의 설정. - - |
<string> |
| 광고에 사용하는 유저 데이터를 구글에 전송하는 것에 대한 동의 설정. - - |
3. 에어브릿지 SDK를 초기화하고 유저 정보를 수집하기 전에 유저 응답 정보를 에어브릿지에 전달합니다.
주의하세요
아래를 주의해 주세요.
eea
,adPersonalization
,adUserData
이름을 동일하게 사용해야 합니다.수집한 정보에 맞게
0
또는1
을 입력해 주세요.
// MainApplication.kt
override fun onCreate() {
super.onCreate()
// Initialize Airbridge SDK
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
// Make Airbridge SDK explicitly start tracking
.setAutoStartTrackingEnabled(false)
.build()
Airbridge.initializeSDK(application, option)
// 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()
}
// MainApplication.java
@Override
public void onCreate() {
super.onCreate();
// Initialize Airbridge SDK
AirbridgeOption option = new AirbridgeOptionBuilder("APP_NAME", "APP_TOKEN")
// Make Airbridge SDK explicitly start tracking
.setAutoStartTrackingEnabled(false)
.build();
Airbridge.initializeSDK(application, option);
// 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();
}
주의하세요
메타 디퍼드 앱 링크를 설정하면 Facebook SDK의
fetchDeferredAppLink
함수를 사용하면 안 됩니다.
아래 방법으로 매타 애즈에서 디퍼드 딥링크를 사용할 수 있습니다. 에어브릿지 SDK는 메타 디퍼드 앱 링크를 먼저 수집합니다. 메타 디퍼드 앱 링크가 없으면 에어브릿지 디퍼드 딥링크를 수집합니다.
메타 애즈의 SKAdNetwork 캠페인은 메타 디퍼드 앱 링크를 지원하지 않습니다. 메타 애즈 가이드를 참고해 주세요.
1. project/build.gradle
파일에 repository를 추가합니다.
allprojects {
...
repositories {
...
mavenCentral()
...
}
...
}
2. app/build.gradle
파일의 dependencies 블럭 안에 아래 코드를 추가합니다.
dependencies {
...
implementation 'com.facebook.android:facebook-android-sdk:latest.release'
...
}
3. app/res/values/string.xml
파일에 아래 코드를 추가합니다.
...
<string name="facebook_app_id">FACEBOOK_APP_ID</string>
<string name="facebook_client_token">FACEBOOK_CLIENT_TOKEN</string>
...
4. AndroidManifest.xml
파일의 <application>
엘리먼트 안에 다음과 같은 <meta-data>
를 추가합니다.
...
<application android:label="@string/app_name" ...>
...
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
...
</application>
...
5. SDK 초기화 단계에서 setTrackMetaDeferredAppLinkEnabled
함수로 페이스북의 디퍼드 앱링크 기능을 사용할 수 있습니다. setTrackMetaDeferredAppLinkEnabled
를 true로 설정합니다.
// Default meta Deferred App Link Enabled = false
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackMetaDeferredAppLinkEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
// Default meta Deferred App Link Enabled = false
AAirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackMetaDeferredAppLinkEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
주의하세요
에어브릿지 SDK 초기화 이후 바로 활성화하지 않으면 설치, 오픈, 딥링크 이벤트가 수집되지 않을 수 있습니다.
에어브릿지 SDK를 초기화하면 모든 기능을 활성화합니다. setSDKEnabled
함수를 false로 설정하면 모든 기능을 비활성화한 상태로 에어브릿지 SDK를 초기화할 수 있습니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build();
Airbridge.initializeSDK(application, option);
또는 아래 방식으로 에어브릿지 SDK의 활성화 여부를 확인하고 모든 기능을 활성화하거나 비활성화할 수 있습니다.
// Checks whether the SDK is currently enabled.
// @return Boolean
Airbridge.isSDKEnabled()
// Enables the SDK.
Airbridge.enableSDK()
// Disables the SDK.
Airbridge.disableSDK()
// Checks whether the SDK is currently enabled.
// @return boolean
Airbridge.isSDKEnabled();
// Enables the SDK.
Airbridge.enableSDK();
// Disables the SDK.
Airbridge.disableSDK();
메타 인스톨 리퍼러(Meta Install Referrer) 수집에 필요한 설정입니다. SDK 초기화 단계에서 setMetaInstallReferrer
함수에 메타 app ID 를 전달합니다.
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setMetaInstallReferrer("YOUR_FACEBOOK_APP_ID")
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setMetaInstallReferrer("YOUR_FACEBOOK_APP_ID")
.build();
Airbridge.initializeSDK(application, option);
설정한 이후에 암호 해독 키를 에어브릿지 대시보드에 입력해야 복호화된 메타 인스톨 리퍼러를 확인할 수 있습니다. 암호 해독 키를 입력하는 방법은 에어브릿지 가이드를 참고해 주세요.
에어브릿지는 앱 이벤트를 최근 6개월 동안 1번이라도 트래킹한 유저를 대상으로 사일런트 푸시를 매일 KST(한국표준시) 0시~1시 사이에 보내서 앱 삭제 여부를 확인합니다. 앱 삭제 이벤트는 에어브릿지 리포트와 원본 데이터 추출 등으로 확인할 수 있습니다.
자세한 설정 방법과 설명은 에어브릿지 가이드를 참고해 주세요.
일부 서드파티 솔루션을 연동하기 위해서는 SDK 설정이 필요합니다. 에어브릿지 SDK로 데이터를 수집하기 전에 서드파티 솔루션에 필요한 설정을 마치는 것을 권장합니다.
각 서드파티 솔루션 연동에 필요한 설정은 아래 가이드를 참고해 주세요.
에어브릿지 SDK가 제공하는 로그는 Debug, Info, Warning, Error, Fault 레벨로 구성됩니다. Debug 레벨이 가장 덜 치명적인 로그이고, Fault 레벨이 가장 치명적인 로그입니다.
에어브릿지 SDK는 Warning, Error, Fault 레벨 이상의 로그를 기본적으로 제공합니다. setLogLevel
함수에 로그 레벨을 입력하면 해당 로그 레벨부터 Fault 레벨까지 로그를 확인할 수 있습니다.
// Default log level = Log.INFO
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLogLevel(AirbridgeLogLevel.DEBUG)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLogLevel(AirbridgeLogLevel.DEBUG)
.build();
Airbridge.initializeSDK(this, option);
도움이 되었나요?