> ## Documentation Index
> Fetch the complete documentation index at: https://help.airbridge.io/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

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

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

<Accordion title="전체 변경사항">
  ## Airbridge interface

  ***

  ### Summary

  |         |                                                                                                                                                                                                                                                                                           |
  | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Unit    | `initializeSDK(app: Application, option: AirbridgeOption)`<br />Initializes the SDK with the provided app and AirbridgeOption.                                                                                                                                                            |
  | Unit    | `enableSDK()`<br />Enables the SDK.                                                                                                                                                                                                                                                       |
  | Unit    | `disableSDK()`<br />Disables the SDK.                                                                                                                                                                                                                                                     |
  | Boolean | `isSDKEnabled()`<br />Checks whether the SDK is currently enabled.                                                                                                                                                                                                                        |
  | Unit    | `startTracking()`<br />Start collecting and transferring events.                                                                                                                                                                                                                          |
  | Unit    | `setDeviceAlias(key: String, value: String)`<br />Sets the key, value pair to the device alias.                                                                                                                                                                                           |
  | Unit    | `removeDeviceAlias(key: String)`<br />Removes the device alias with the given key.                                                                                                                                                                                                        |
  | Unit    | `clearDeviceAlias()`<br />Clears all device aliases.                                                                                                                                                                                                                                      |
  | Unit    | `setUserID(String)`<br />Sets the user ID.                                                                                                                                                                                                                                                |
  | Unit    | `setUserEmail(String)`<br />Sets the user email.                                                                                                                                                                                                                                          |
  | Unit    | `setUserPhone(String)`<br />Sets the user phone number.                                                                                                                                                                                                                                   |
  | Unit    | `setUserAttribute(key: String, value: Int)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                          |
  | Unit    | `setUserAttribute(key: String, value: Long)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                         |
  | Unit    | `setUserAttribute(key: String, value: Float)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                        |
  | Unit    | `setUserAttribute(key: String, value: Double)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                       |
  | Unit    | `setUserAttribute(key: String, value: Boolean)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                      |
  | Unit    | `setUserAttribute(key: String, value: String)`<br />Sets the key, value pair to the user attribute.                                                                                                                                                                                       |
  | Unit    | `removeUserAttribute(key: String)`<br />Removes the user attribute with the given key.                                                                                                                                                                                                    |
  | Unit    | `clearUserAttributes()`<br />Clears all user attributes.                                                                                                                                                                                                                                  |
  | Unit    | `setUserAlias(key: String, value: String)`<br />Sets the key, value pair to the user alias.                                                                                                                                                                                               |
  | Unit    | `removeUserAlias(key: String)`<br />Removes the user alias with the given key.                                                                                                                                                                                                            |
  | Unit    | `clearUserAlias()`<br />Clears all user aliases.                                                                                                                                                                                                                                          |
  | Unit    | `clearUser()`<br />Clears all user information.                                                                                                                                                                                                                                           |
  | Unit    | `registerPushToken(token: String)`<br />Registers the FCM registration token to track app uninstalls.                                                                                                                                                                                     |
  | Boolean | `isUninstallTrackingNotification(RemoteMessage)`<br />Silent notifications are sent without any data. However, the notification may be shown to the user depending on the onMessageReceived settings. determine whether it is an app deletion tracking push message.                      |
  | Unit    | `trackEevnt(category: String, semanticAttributes: Map<String, Any> = null, customAttributes: Map<String, Any> = null)`<br />track events.                                                                                                                                                 |
  | Boolean | `handleDeeplink(intent: Intent, onSuccess: OnSuccess<Uri>, onFailure: OnFailure? = null)`<br />Handle Airbridge's deep link from the provided intent and invoke a callback based on the result.                                                                                           |
  | Boolean | `handleDeferredDeeplink(onSuccess: OnSuccess<Uri?>, onFailure: OnFailure? = null)`<br />Handle deferred deep link and invoke a callback based on the result.                                                                                                                              |
  | Boolean | `click(trackingLink: URL, onSuccess: OnSuccess<Unit>, onFailure: OnFailure? = null)`<br />Queries the tracking link to the server to get the deeplink information and then moves according to that information if a deeplink is set up. It also adds a click event for the tracking link. |
  | Boolean | `impression(trackingLink: String, onSuccess: OnSuccess<Unit>, onFailure: OnFailure? = null)`<br />Adds an impression event for the tracking link.                                                                                                                                         |
  | Unit    | `setWebInterface(webView: WebView, webToken: String)`<br />Enables the Android SDK to automatically pull all events from the web SDK that is installed on the website of the WebView environment.                                                                                         |
  | Boolean | `fetchDeviceUUID(onSuccess: OnSuccess<String>, onFailure: OnFailure? = null)`<br />Fetches the Device UUID using the provided callbacks for success and failure.                                                                                                                          |
  | Boolean | `fetchGoogleInstallReferrerDetails(onSuccess: OnSuccess<ReferrerDetails?>, onFailure: OnFailure? = null)`<br />fetch Google install referrer                                                                                                                                              |
  | Boolean | `fetchHuaweiInstallReferrerDetails(onSuccess: OnSuccess<ReferrerDetails?>, onFailure: OnFailure? = null)`<br />fetch Huawei install referrer                                                                                                                                              |
  | Boolean | `fetchOneStoreInstallReferrerDetails(onSuccess: OnSuccess<ReferrerDetails?>, onFailure: OnFailure? = null)`<br />fetch One store install referrer                                                                                                                                         |
  | Boolean | `fetchGalaxyStoreInstallReferrerDetails(onSuccess: OnSuccess<ReferrerDetails?>, onFailure: OnFailure? = null)`<br />fetch Galaxy store install referrer                                                                                                                                   |
  | Boolean | `fetchMetaInstallReferrerDetails(onSuccess: OnSuccess<ReferrerDetails?>, onFailure: OnFailure? = null)`<br />fetch Meta install referrer                                                                                                                                                  |
  | Boolean | `fetchGoogleAdvertisingIdInfo(onSuccess: OnSuccess<AdvertisingIdInfo>, onFailure: OnFailure? = null)`<br />fetch Google Advertising ID info                                                                                                                                               |
  | Boolean | `fetchHuaweiAdvertisingIdInfo(onSuccess: OnSuccess<AdvertisingIdInfo>, onFailure: OnFailure? = null)`<br />fetch Huawei Advertising ID info                                                                                                                                               |

  ### Deprecated interface

  |                     |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
  | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Unit                | `init(app: Application, config: AirbridgeConfig)`<br />**<em>This method was deprecated in v4.</em>**<br />use `initializeSDK(Application, AirbridgeOption)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | AirbridgeDeviceInfo | `getDeviceInfo()`<br />**<em>This method was deprecated in v4.</em>**<br />use `setDeviceAlias(String, String)`instead<br />use `removeDeviceAlias(String)` instead<br />use `clearDeviceAlias()` instead<br />use `fetchDeviceUUID(OnSuccess<String>, OnFailure?)` instead<br />use `fetchGoogleInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchHuaweiInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchOneStoreInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchGalaxyStoreInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchMetaInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchGoogleAdvertisingIdInfo(OnSuccess<AdvertisingIdInfo>, OnFailure?)` instead<br />use `fetchHuaweiAdvertisingIdInfo(OnSuccess<AdvertisingIdInfo>, OnFailure?)` instead |
  | AirbridgeUser       | `getCurrentUser()`<br />**<em>This method was deprecated in v4.</em>**<br />use `setUserID(String)` instead<br />use `setUserEmail(String)` instead<br />use `setUserPhone(String)` instead<br />use `setUserAttribute(String, Int)` instead<br />use `setUserAttribute(String, Long)`instead<br />use `setUserAttribute(String, Float)` instead<br />use `setUserAttribute(String, Double)` instead<br />use `setUserAttribute(String, Boolean)` instead<br />use `setUserAttribute(String, String)` instead<br />use `removeUserAttribute(String)` instead<br />use `clearUserAttributes()` instead<br />use `setUserAlias(String, String)` instead<br />use `removeUserAlias(String)` instead<br />use `clearUserAlias()` instead                                                                                                                                                                                                                       |
  | Unit                | `expireUser()`<br />**<em>This method was deprecated in v4.</em>**<br />use `clearUser()` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
  | Unit                | `trackEvent(category: StandardEventCategory, action: String? = null, label: String? = null, value: Number? = null, customAttributes: Map<String, Any?>? = null, semanticAttributes: Map<String, Any?>? = null)`<br />**<em>This method was removed in v4.</em>**<br />use `trackEvent(String, Map<String, Any>?, Map<String, Any>?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  | Unit                | `trackEvent(category: String, action: String? = null, label: String? = null, value: Number? = null, customAttributes: Map<String, Any?>? = null, semanticAttributes: Map<String, Any?>? = null)`<br />**<em>This method was deprecated in v4.</em>**<br />use `trackEvent(String, Map<String, Any>?, Map<String, Any>?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | Unit                | `trackEvent(event: Event)`<br />**<em>This method was deprecated in v4.</em>**<br />use `trackEvent(String, Map<String, Any>?, Map<String, Any>?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  | Unit                | `getDeeplink(intent: Intent, callback: AirbridgeCallback<Uri>)`<br />**<em>This method was deprecated in v4.</em>**<br />use `handleDeeplink(Intent, OnSuccess<Uri>, OnFailure?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  | Unit                | `click(trackingLink: String, callback: AirbridgeCallback<Boolean>? = null)`<br />**<em>This method was deprecated in v4.</em>**<br />use `click(String, OnSuccess<Unit>, OnFailure?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
  | Unit                | `impression(trackingLink: String)`<br />**<em>This method was deprecated in v4.</em>**<br />use `impression(String, OnSuccess<Unit>, OnFailure?)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  | Unit                | `setJavascriptInterface(webView: WebView, webToken: String)`<br />**<em>This method was deprecated in v4.</em>**<br />use `setWebInterface(WebView, String)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |

  ## Class 변경 사항

  ***

  ### Added

  | Class name          | Description                                                                    |
  | ------------------- | ------------------------------------------------------------------------------ |
  | AirbridgeOption     | `initializeSDK(Application, AirbridgeOption)` 에서 사용하는 Option class             |
  | AirbridgeCategory   | `trackEvent(String, Map<String, Any>?, Map<String, Any>?)`에서 사용되는 스탠다드 이벤트의 키  |
  | AirbridgeAttributes | `trackEvent(String, Map<String, Any>?, Map<String, Any>?)`에서 사용되는 시멘틱 어트리뷰트의 키 |
  | OnSuccess           | OnSuccess callback                                                             |
  | OnFailure           | OnFailure callback                                                             |
  | AirbridgeLogLevel   | Airbridge log level                                                            |

  ### Hidden

  | Class name | Description                                                                                                           |
  | ---------- | --------------------------------------------------------------------------------------------------------------------- |
  | Event      | **<em>This class was hidden in v4.</em>**<br />use `trackEvent(String, Map<String, Any>?, Map<String, Any>?)` instead |

  ### Removed

  | Class name                          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
  | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | AirbridgeConfig                     | **<em>This class was removed in v4.</em>**<br />use `setWebInterface(WebView, String)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
  | StandardEventCategory               | **<em>This class was removed in v4.</em>**<br />use `AirbridgeCategory` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
  | SemanticAttributes                  | **<em>This class was removed in v4.</em>**<br />use `AirbridgeAttributes` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  | Product                             | **<em>This class was removed in v4.</em>**<br />use `AirbridgeAttributes` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  | AirbridgeCallback                   | **<em>This class was removed in v4.</em>**<br />use `OnSuccess<T>`, `OnFailure` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | OnDeferredDeeplinkReceiveListener   | **<em>This class was removed in v4.</em>**<br />use `handleDeferredDeeplink(OnSuccess<T>, OnFailure)` instead                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
  | OnDeferredDeeplinkDetermineListener | **<em>This class was removed in v4.</em>**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
  | AirbridgeDeviceInfo                 | **<em>This method was removed in v4.</em>**<br />use `setDeviceAlias(String, String)` instead<br />use `removeDeviceAlias(String)` instead<br />use `clearDeviceAlias()` instead<br />use `fetchDeviceUUID(OnSuccess<String>, OnFailure?)` instead<br />use `fetchGoogleInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchHuaweiInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchOneStoreInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchGalaxyStoreInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchMetaInstallReferrerDetails(OnSuccess<ReferrerDetails?>, OnFailure?)` instead<br />use `fetchGoogleAdvertisingIdInfo(OnSuccess<AdvertisingIdInfo>, OnFailure?)` instead<br />use `fetchHuaweiAdvertisingIdInfo(OnSuccess<AdvertisingIdInfo>, OnFailure?)` instead |
  | AirbridgeUser                       | **<em>This method was removed in v4.</em>**<br />use `setUserID(String)` instead<br />use `setUserEmail(String)` instead<br />use `setUserPhone(String)` instead<br />use `setUserAttribute(String, Int)` instead<br />use `setUserAttribute(String, Long)` instead<br />use `setUserAttribute(String, Float)` instead<br />use `setUserAttribute(String, Double)` instead<br />use `setUserAttribute(String, Boolean)` instead<br />use `setUserAttribute(String, String)` instead<br />use `removeUserAttribute(String)` instead<br />use `clearUserAttributes()` instead<br />use `setUserAlias(String, String)` instead<br />use `removeUserAlias(String)` instead<br />use `clearUserAlias()` instead                                                                                                                                                                                                                        |

  ### Moved

  | Class name        | Description                              |
  | ----------------- | ---------------------------------------- |
  | AdvertisingIdInfo | move `co.ab180.airbridge.common` package |
  | ReferrerDetails   | move `co.ab180.airbridge.common` package |

  ## AirbridgeOption

  ***

  | AirbridgeConfig                                                               | AirbridgeOption                                                | default value               |
  | ----------------------------------------------------------------------------- | -------------------------------------------------------------- | --------------------------- |
  | `constructor(String, String)`                                                 | `constructor(String, String)`                                  | -                           |
  | `setSDKSignatureSecret(String, String)`                                       | `setSDKSignatureSecret(String, String)`                        | -                           |
  | `setLogLevel(int)`                                                            | `setLogLevel(AirbridgeLogLevel)`                               | `AirbridgeLogLevel.WARNING` |
  | `setSessionTimeoutSeconds(Long)`                                              | `setSessionTimeout(Long)`                                      | 300                         |
  | `setUserInfoHashEnabled(Boolean)`                                             | `setHashUserInformationEnabled(Boolean)`                       | true                        |
  | `setAutoStartTrackingEnabled(Boolean)`                                        | `setAutoStartTrackingEnabled(Boolean)`                         | true                        |
  | `setTrackAirbridgeLinkOnly(Boolean)`                                          | `setTrackAirbridgeDeeplinkOnlyEnabled(Boolean)`                | false                       |
  | `setTransmitEventOnBackgroundEnabled(Boolean)`                                | `setPauseEventTransmitOnBackgroundEnabled(Boolean)`            | false                       |
  | `setLocationCollectionEnabled(Boolean)`                                       | `setCollectLocationEnabled(Boolean)`                           | false                       |
  | `setFacebookDeferredAppLinkEnabled(Boolean)`                                  | `setTrackMetaDeferredAppLinkEnabled(Boolean)`                  | false                       |
  | `setErrorLogCollectionEnabled(Boolean)`                                       | `setErrorLogCollectionEnabled(Boolean)`                        | true                        |
  | `setResetEventBufferEnabled(Boolean)`                                         | `setClearEventBufferOnInitializeEnabled(Boolean)`              | false                       |
  | `setSdkEnabled(Boolean)`                                                      | `setSdkEnabled(Boolean)`                                       | true                        |
  | `setAppMarketIdentifier(String)`                                              | `setAppMarketIdentifier(String)`                               | “”                          |
  | `setPlatform(String)`                                                         | `setSDKDevelopmentPlatform(String)`                            | “native”                    |
  | `setEventMaximumBufferCount(Int)`                                             | `setEventBufferCountLimit(Int)`                                | Int.MAX\_VALUE              |
  | `setEventMaximumBufferSize(Long)`                                             | `setEventBufferSizeLimit(Long)`                                | Long.MAX\_VALUE             |
  | `setEventTransmitInterval(Long)`                                              | `setEventTransmitInterval(Long)`                               | 0                           |
  | `setCustomDomains(List<String>)`                                              | `setCustomDomains(List<String>)`                               | emptyList()                 |
  | `setOnDeferredDeeplinkReceiveListener(OnDeferredDeeplinkReceiveListener)`     | <em>remove</em>                                                | -                           |
  | `setOnDeferredDeeplinkDetermineListener(OnDeferredDeeplinkDetermineListener)` | <em>remove</em>                                                | -                           |
  | `setOnAttributionResultReceiveListener(OnAttributionResultReceiveListener)`   | `setOnAttributionReceived(OnAttributionResultReceiveListener)` | null                        |
  | `setFacebookOnDeviceAttribution(String)`                                      | `setMetaInstallReferrer(String)`                               | null                        |
  | `setLifecycleIntegration(AirbridgeLifecycleIntegration)`                      | `setLifecycleIntegration(AirbridgeLifecycleIntegration)`       | null                        |
</Accordion>

### SDK 초기화

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

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

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

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  override fun onCreate() {
      super.onCreate()
      val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
          .build()
      Airbridge.initializeSDK(this, option)
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  @Override
  public void onCreate() {
      super.onCreate();
      AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
          .build();
      Airbridge.initializeSDK(this, option);
  }
  ```
</CodeGroup>

### 딥링크

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

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  val result = Airbridge.handleDeeplink(
      intent = intent
      onSuccess = { },
      onFailure = { }
  )
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  boolean result = Airbridge.handleDeeplink(
          intent,
          uri -> { },
          throwable -> { }
  );
  ```
</CodeGroup>

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

<Accordion title="필요한 작업 - 디퍼드 딥링크 처리">
  * `handleDeeplink` 와 값을 activity 구성에서 호출할 수 있습니다.
  * result 값으로 디퍼드 딥링크를 처리할 수 있는 상태인지 확인할 수 있습니다.
  * 디퍼드 딥링크는 앱 설치 이후에 1번만 획득하도록 설계됐습니다. 값을 이미 획득했거나 먼저 호출하면 result는 false입니다.

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.handleDeferredDeeplink(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.handleDeferredDeeplink(
            uri -> { },
            throwable -> { }
    );
    ```
  </CodeGroup>
</Accordion>

### 커스텀 도메인 설정하기

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

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

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 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)
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  // 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);
  ```
</CodeGroup>

### 인앱 이벤트 및 유저 정보

아래 기존 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` 함수를 참고해 주세요.

<AccordionGroup>
  <Accordion title="SDK가 제공하는 스탠다드 이벤트 카테고리(AirbridgeCategory)">
    | 키                       | 데이터                                      |
    | ----------------------- | ---------------------------------------- |
    | SIGN\_UP                | airbridge.user.signup                    |
    | SIGN\_IN                | airbridge.user.signin                    |
    | SIGN\_OUT               | airbridge.user.signout                   |
    | HOME\_VIEWED            | airbridge.ecommerce.home.viewed          |
    | PRODUCT\_LIST\_VIEWED   | airbridge.ecommerce.productList.viewed   |
    | SEARCH\_RESULTS\_VIEWED | airbridge.ecommerce.searchResults.viewed |
    | PRODUCT\_VIEWED         | airbridge.ecommerce.product.viewed       |
    | ADD\_PAYMENT\_INFO      | airbridge.addPaymentInfo                 |
    | ADD\_TO\_WISHLIST       | airbridge.addToWishlist                  |
    | ADDED\_TO\_CART         | airbridge.ecommerce.product.addedToCart  |
    | INITIATE\_CHECKOUT      | airbridge.initiateCheckout               |
    | ORDER\_COMPLETED        | airbridge.ecommerce.order.completed      |
    | ORDER\_CANCELED         | airbridge.ecommerce.order.canceled       |
    | START\_TRIAL            | airbridge.startTrial                     |
    | SUBSCRIBE               | airbridge.subscribe                      |
    | UNSUBSCRIBE             | airbridge.unsubscribe                    |
    | AD\_IMPRESSION          | airbridge.adImpression                   |
    | AD\_CLICK               | airbridge.adClick                        |
    | COMPLETE\_TUTORIAL      | airbridge.completeTutorial               |
    | ACHIEVE\_LEVEL          | airbridge.achieveLevel                   |
    | UNLOCK\_ACHIEVEMENT     | airbridge.unlockAchievement              |
    | RATE                    | airbridge.rate                           |
    | SHARE                   | airbridge.share                          |
    | SCHEDULE                | airbridge.schedule                       |
    | SPEND\_CREDITS          | airbridge.spendCredits                   |
  </Accordion>

  <Accordion title="SDK가 제공하는 시맨틱 어트리뷰트(AirbridgeAttribute)">
    | 키                                     | 데이터                             | 데이터 형식  |
    | ------------------------------------- | ------------------------------- | ------- |
    | ACTION                                | action                          | string  |
    | LABEL                                 | label                           | string  |
    | VALUE                                 | value                           | float   |
    | CURRENCY                              | currency                        | string  |
    | PRODUCTS                              | products                        | array   |
    | PRODUCT\_ID                           | productID                       | string  |
    | PRODUCT\_NAME                         | name                            | string  |
    | PRODUCT\_PRICE                        | price                           | float   |
    | PRODUCT\_QUANTITY                     | quantity                        | int     |
    | PRODUCT\_CURRENCY                     | currency                        | string  |
    | PRODUCT\_POSITION                     | position                        | int     |
    | PRODUCT\_CATEGORY\_ID                 | categoryID                      | string  |
    | PRODUCT\_CATEGORY\_NAME               | categoryName                    | string  |
    | PRODUCT\_BRAND\_ID                    | brandID                         | string  |
    | PRODUCT\_BRAND\_NAME                  | brandName                       | string  |
    | PERIOD                                | period                          | string  |
    | IS\_RENEWAL                           | isRenewal                       | boolean |
    | RENEWAL\_COUNT                        | renewalCount                    | int     |
    | PRODUCT\_LIST\_ID                     | productListID                   | string  |
    | CART\_ID                              | cartID                          | string  |
    | TRANSACTION\_ID                       | transactionID                   | string  |
    | TRANSACTION\_TYPE                     | transactionType                 | string  |
    | TRANSACTION\_PAIRED\_EVENT\_CATEGORY  | transactionPairedEventCategory  | string  |
    | TRANSACTION\_PAIRED\_EVENT\_TIMESTAMP | transactionPairedEventTimestamp | int     |
    | TOTAL\_QUANTITY                       | totalQuantity                   | int     |
    | QUERY                                 | query                           | string  |
    | IN\_APP\_PURCHASED                    | inAppPurchased                  | boolean |
    | CONTRIBUTION\_MARGIN                  | contributionMargin              | float   |
    | LIST\_ID                              | listID                          | string  |
    | RATE\_ID                              | rateID                          | string  |
    | RATE                                  | rate                            | float   |
    | MAX\_RATE                             | maxRate                         | float   |
    | ACHIEVEMENT\_ID                       | achievementID                   | string  |
    | SHARED\_CHANNEL                       | sharedChannel                   | string  |
    | DATE\_TIME                            | datetime                        | string  |
    | DESCRIPTION                           | description                     | string  |
    | IS\_REVENUE                           | isRevenue                       | boolean |
    | PLACE                                 | place                           | string  |
    | SCHEDULE\_ID                          | scheduleID                      | string  |
    | TYPE                                  | type                            | string  |
    | LEVEL                                 | level                           | string  |
    | SCORE                                 | score                           | float   |
    | AD\_PARTNERS                          | adPartners                      | array   |
    | IS\_FIRST\_PER\_USER                  | isFirstPerUser                  | boolean |
  </Accordion>

  <Accordion title="예시) trackEvent 함수">
    <CodeGroup>
      ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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",
          )
      )
      ```

      ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
      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");
              }}
      );
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

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

<Accordion title="필요한 작업 - 에어브릿지 인터페이스">
  `Airbridge.getUserInfo()`를 통해서 접근하는 코드 대신 아래 에어브릿지 인터페이스로 교체해 사용해야 합니다.

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    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()
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    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()
    ```
  </CodeGroup>
</Accordion>

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

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

<Accordion title="필요한 작업 - OnSuccess, OnFailure">
  Airbridge.getDeviceInfo()를 통해서 접근하는 코드 대신 아래 에어브릿지 인터페이스로 교체해서 사용해야 합니다.

  #### Device UUID

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchDeviceUUID(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchDeviceUUID(
            uuid -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>

  #### Install referrer

  ###### fetch Google Install referrer

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchGoogleInstallReferrerDetails(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchGoogleInstallReferrerDetails(
            referrerDetails -> { },
            throwable -> { }
    );
    ```
  </CodeGroup>

  ###### fetch Huawei Install referrer

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchHuaweiInstallReferrerDetails(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchHuaweiInstallReferrerDetails(
            referrerDetails -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>

  ###### fetch Galaxy store Install referrer

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchGalaxyStoreInstallReferrerDetails(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchGalaxyStoreInstallReferrerDetails(
            referrerDetails -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>

  ###### fetch Meta Install referrer

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchMetaInstallReferrerDetails(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchMetaInstallReferrerDetails(
            referrerDetails -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>

  #### Advertising ID

  ###### fetch Google Advertising ID

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchGoogleAdvertisingIdInfo(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchGoogleAdvertisingIdInfo(
            advertisingIdInfo -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>

  ###### fetch Huawei Advertising ID

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    val result = Airbridge.fetchHuaweiAdvertisingIdInfo(
        onSuccess = { },
        onFailure = { }
    )
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean result = Airbridge.fetchHuaweiAdvertisingIdInfo(
            advertisingIdInfo -> { },
            throwable -> { }
        );
    ```
  </CodeGroup>
</Accordion>

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

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  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)
      }
  }
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  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()
                  );
      }
  }
  ```
</CodeGroup>

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

<Accordion title="예시) click, impression">
  ###### click

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    fun click(
        trackingLink: String,
        onSuccess: OnSuccess<Unit>? = null,
        onFailure: OnFailure? = null
    ): Boolean
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean click(
        @NonNull String trackingLink,
        @Nullable OnSuccess<Unit> onSuccess,
        @Nullable OnFailure onFailure
    )
    ```
  </CodeGroup>

  ###### impression

  <CodeGroup>
    ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    fun impression(
        trackingLink: String,
        onSuccess: OnSuccess<Unit>? = null,
        onFailure: OnFailure? = null
    ): Boolean
    ```

    ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    boolean impression(
        @NonNull String trackingLink,
        @Nullable OnSuccess<Unit> onSuccess,
        @Nullable OnFailure onFailure
    )
    ```
  </CodeGroup>
</Accordion>

### 하이브리드 연동

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

<CodeGroup>
  ```kotlin Kotlin lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  Airbridge.setWebInterface(webview, "YOUR_WEB_TOKEN")
  ```

  ```java Java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  Airbridge.setWebInterface(webview, "YOUR_WEB_TOKEN")
  ```
</CodeGroup>

## 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 호출의 경우에만 수집될 수 있도록 변경되었습니다.

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/migration-guide-for-android-sdk-v4" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/migration-guide-for-android-sdk-v4" />
