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

# Expo SDK (Deprecated)

![NPM Version](https://img.shields.io/npm/v/airbridge-expo-sdk/sdk-v2?label=airbridge-expo-sdk)

![](https://img.shields.io/badge/airbridge--react--native--sdk-2.8.6-blue)

<Danger>
  **Deprecated SDK**

  이 SDK는 Deprecated 되었습니다. 최신 버전인 [엑스포 SDK v4](/ko/developers/expo-sdk-v4)로 전환하세요.
</Danger>

## SDK 설치

***

### 패키지 설치

npm 을 사용하여 `airbridge-expo-sdk`와 `airbridge-react-native-sdk`를 설치해주세요.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
npm install --save airbridge-expo-sdk
npm install --save airbridge-react-native-sdk
```

<Danger>
  **주의하세요**

  Airbridge Expo SDK는 `expo go` 환경을 지원하지 않습니다. `expo prebuild` 또는 `eas build` 를 사용해주세요.
</Danger>

### 프로젝트 설정

###### app.json

`app.json` 에 아래 설정을 추가해주세요.

```json app.json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
  "expo": {
    ...
    "plugins": [
      ...
      [
        "airbridge-expo-sdk",
        {
          "appName": "APP_NAME",
          "appToken": "APP_TOKEN"
        }
      ]
    ]
  }
}
```

<Note>
  `APP_NAME`은 Airbridge 대시보드 내 \[Settings]>\[Tokens]>\[App Name]에서 확인할 수 있습니다.

  `APP_TOKEN`은 Airbridge 대시보드 내 \[Settings]>\[Tokens]>\[App SDK Token]에서 확인할 수 있습니다.
</Note>

###### airbridge.json

1. 프로젝트 폴더에 `airbridge.json`파일을 생성해주세요.
2. JSON 형식으로 설정값을 넣어주세요.

###### Example

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
    "sessionTimeoutSeconds": 300,
    "autoStartTrackingEnabled": true,
    "userInfoHashEnabled": true,
    "trackAirbridgeLinkOnly": false,
    "facebookDeferredAppLinkEnabled": false,
    "locationCollectionEnabled": false,
    "trackingAuthorizeTimeoutSeconds": 30,
    "sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
    "sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET",
    "logLevel": "warning"
}
```

###### Description

| 이름                              | 타입      | 기본값     | 설명                                                                                                                                                                                                   |
| ------------------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sessionTimeoutSeconds           | Number  | 300     | 설정한 세션기간 내에 유저가 앱을 재실행하는 경우에는, 같은 세션으로 판단하여 앱 실행 이벤트를 전송하지 않습니다.                                                                                                                                     |
| autoStartTrackingEnabled        | Boolean | true    | false 로 설정하면, Airbridge.state.startTracking() 을 호출하기 전까지 이벤트를 전송하지 않습니다.                                                                                                                             |
| userInfoHashEnabled             | Boolean | true    | false 로 설정하면, User Email 및 User Phone 정보를 Hash 하지않고 이벤트를 전송합니다.                                                                                                                                      |
| trackAirbridgeLinkOnly          | Boolean | false   | true 로 설정하면, Airbridge 딥링크로 앱이 열린 경우에만 딥링크 이벤트를 전송합니다.                                                                                                                                               |
| facebookDeferredAppLinkEnabled  | Boolean | false   | true 로 설정하고 Facebook SDK 가 설치되어 있으면, Facebook Deferred AppLink 를 수집합니다.                                                                                                                              |
| locationCollectionEnabled       | Boolean | false   | true 로 설정하면, 해당 기기의 위치 정보를 수집합니다. (Android 전용)<br />사용하기 위해서는 AndroidManifest.xml 에 아래 2개 권한이 필요합니다.<br />android.permission.ACCESS\_FINE\_LOCATION<br />android.permission.ACCESS\_COARSE\_LOCATION |
| trackingAuthorizeTimeoutSeconds | Number  | 30      | timeout 을 설정하면, 설치 이벤트를 전송하기 전에 timeout 만큼 `추적 허용 선택창`이 선택될 때 까지 기다립니다. (iOS 전용)                                                                                                                     |
| sdkSignatureSecretID            | String  | null    | SDK spoofing 방지 기능을 동작 합니다. 발급 받은 SDK Signature Secret ID, Secret key 가 동시에 적용 되어야 합니다.                                                                                                              |
| sdkSignatureSecret              | String  | null    | SDK spoofing 방지 기능을 동작 합니다. 발급 받은 SDK Signature Secret ID, Secret key 가 동시에 적용 되어야 합니다.                                                                                                              |
| logLevel                        | String  | warning | Airbridge log 출력 level 을 설정 합니다.<br />logLevel: "debug" \| "info" \| "warning" \| "error" \| "fault"                                                                                                 |

### SDK 설치 확인

앱을 설치하고 실행했을 때 Install 이벤트가 전송되는지 확인해주세요.

###### 대시보드에서 확인

SDK 에서 발생한 Event 들은 에어브릿지 대시보드 내 \[ Raw Data > App Real-time Logs ] 에 출력됩니다.

1. 에어브릿지 대시보드 내 \[ Raw Data > App Real-time Logs ] 항목을 클릭해 주세요.
2. 검색어 입력에 디바이스의 ADID를 입력해주세요. (IDFA, IDFV, GAID)

<Danger>
  **주의하세요**

  로그가 노출되기까지 최대 5분정도 소요될 수 있습니다.
</Danger>

## 딥링크 설정

***

### 대시보드 설정

딥링크 설정을 위해 에어브릿지 대시보드에서 아래 가이드에 따라 진행해주세요.

* [iOS 딥링크 대시보드 설정 가이드](/ko/developers/deprecated-ios-sdk-v1#대시보드-설정)
* [Android 딥링크 대시보드 설정 가이드](/ko/developers/deprecated-android-sdk-v2#대시보드-설정)

### 프로젝트 설정

###### app.json

`app.json` 에 아래 설정을 추가해주세요.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
  "expo": {
    ...
    "scheme": "YOUR_SCHEME",
    "android": {
      ...
      "intentFilters": [{
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "https", "host": "APP_NAME.airbridge.io" },
        "category": ["BROWSABLE", "DEFAULT"]
      }, {
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "https", "host": "APP_NAME.deeplink.page" },
        "category": ["BROWSABLE", "DEFAULT"]
      }, {
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "http", "host": "APP_NAME.airbridge.io" },
        "category": ["BROWSABLE", "DEFAULT"]
      }, {
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "http", "host": "APP_NAME.deeplink.page" },
        "category": ["BROWSABLE", "DEFAULT"]
      }]
    },
    "ios": {
      ...
      "associatedDomains": [
        "applinks:APP_NAME.airbridge.io",
        "applinks:APP_NAME.deeplink.page"
      ]
    }
  }
}
```

<Note>
  `YOUR_SCHEME`은 Airbridge 대시보드 내 \[Tracking Link]>\[Deep Link]>\[URL Scheme]에서 확인할 수 있습니다.
</Note>

###### setDeeplinkListener

딥링크 또는 지연된 딥링크가 발생할 때 마다 호출되는 함수를 등록합니다.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import Airbridge from 'airbridge-react-native-sdk'

Airbridge.deeplink.setDeeplinkListener((deeplink) => {
    // code that will run when app is opened with deep-link or deferred-deep-link
    // deeplink = YOUR_SCHEME://...
    console.log(deeplink)
})
```

<Danger>
  **주의하세요**

  만약 `setDeeplinkListener`를 여러번 호출 시, 마지막 Listener만 deeplink 데이터를 받게 됩니다.
</Danger>

### 커스텀 도메인 설정 (옵션)

###### app.json

`app.json` 에 아래 설정을 추가해주세요.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
  "expo": {
    ...
    "android": {
      ...
      "intentFilters": [{
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "https", "host": "YOUR_DOMAIN.YOUR_DOMAIN.example" },
        "category": ["BROWSABLE", "DEFAULT"]
      }, {
        "autoVerify": true,
        "action": "VIEW",
        "data": { "scheme": "http", "host": "YOUR_DOMAIN.YOUR_DOMAIN.example" },
        "category": ["BROWSABLE", "DEFAULT"]
      }]
    },
    "ios": {
      ...
      "associatedDomains": [
        "applinks:YOUR_DOMAIN.YOUR_DOMAIN.example"
      ]
    },
    "plugins": [
      ...
      [
        "airbridge-expo-sdk",
        {
          ...
          "customDomains": [
            "YOUR_DOMAIN.YOUR_DOMAIN.example"
          ]
        }
      ]
    ]
  }
}
```

<Note>
  `YOUR_DOMAIN.YOUR_DOMAIN.example`은 에어브릿지 대시보드 내 \[ Tracking Link → Domain Setting → Custom Domain ] 에서 확인할 수 있습니다.
</Note>

### 딥링크 설정 확인

URI scheme을 클릭하여 Airbridge SDK 내의 딥링크가 정상적으로 설정되었는지 확인해주세요.

* `YOUR_SCHEME://`

딥링크가 정상적으로 설정되었다면 딥링크 이벤트가 에어브릿지 대시보드 내 \[ Raw Data → App Real-time Logs ] 에 출력됩니다.

## 사용자 설정

***

사용자 설정을 위해 아래 가이드를 참고 부탁드립니다.

* [사용자 설정 가이드](/ko/developers/deprecated-react-native-sdk-v2#사용자-설정)

## 디바이스 설정

***

디바이스 설정을 위해 아래 가이드를 참고 부탁드립니다.

* [디바이스 설정 가이드](/ko/developers/deprecated-react-native-sdk-v2#디바이스-설정)

## 이벤트 설정

***

이벤트 설정을 위해 아래 가이드를 참고 부탁드립니다.

* [이벤트 설정 가이드](/ko/developers/deprecated-react-native-sdk-v2#이벤트-설정)

## 고급 설정

***

### Restricted SDK

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

### SDK Signature 설정

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

SDK signature 기능을 사용하기 위해서는 `airbridge_expo_sdk@2.2.0`, `airbridge-react-native-sdk@2.3.0` 이상 버전 부터 적용 가능합니다.

* 프로젝트 폴더의 `airbridge.json`파일에 아래 사항을 JSON 형식으로 설정값을 넣어주세요.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
    "sdkSignatureSecretID": "YOUR_SDK_SIGNATURE_SECRET_ID",
    "sdkSignatureSecret": "YOUR_SDK_SIGNATURE_SECRET"
}
```

<Note>
  SDK Signature를 설정하기 위해서는 SDK Signature 보안 정보가 필요합니다. SDK Signature 보안 정보를 생성하기 위한 자세한 내용은 [에어브릿지 가이드](/ko/guides/sdk-signature#sdk-시그니처-보안-정보-생성하기)를 참고해 주세요.
</Note>

### 기타 설정

다른 기타 고급 설정을 위해 아래 가이드를 참고 부탁드립니다.

* [고급 설정 가이드](/ko/developers/deprecated-react-native-sdk-v2#고급-설정)

## Troubleshooting

***

### expo-route

기존에 expo-route 를 사용중인 경우 SDK 설치 후 expo-route 기능이 동작 하지 않습니다.

Airbridge tracking link 를 통해서 app 진입 시 진입한 링크를 airbridge 를 통해서 scheme deeplink 로 변환 처리 후 route 처리가 되어야 합니다. 그러나 expo-router 로 인해 route 처리가 중복, 잘못된 이동 등과 같은 옳지 않은 방향으로 처리 될 수 있습니다.

그리하여 Airbridge Expo SDK 에서 Deeplink 를 route 처리되도록 설계 되었습니다.

아래 코드와 같이 `airbridge.deeplink.setDeeplinkListener` 내에서 route 되도록 처리 해주세요.

```dart lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import * as Router from 'expo-router';

const router = Router.useRouter();

airbridge.deeplink.setDeeplinkListener((_deeplink) => {
  // route deeplink
  router.push(...);
});
```

### Webcredentials

App 에서 [Autofill](https://developer.apple.com/documentation/security/password-autofill) 기능을 사용해 비밀번호를 저장하는 경우 `webcredentials:...` 설정이 되어 있지 않으면 비밀번호가 `applinks:YOUR_APP_NAME.airbridge.io` 또는 `applinks:YOUR_APP_NAME.abr.ge` 의 도메인에 저장됩니다.

비밀번호가 저장되는 도메인을 변경하고 싶다면, `example.com` 을 `설정할 도메인` 으로 변경해서 아래와 같이 설정해주세요.

1. `https://example.com/.well-known/apple-app-site-association`주소에서 아래 내용을 호스팅 합니다.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
    "webcredentials": {
        "apps": ["TEAM_ID.APP_BUNDLE_ID"]
    }
}
```

예) 9JA89QQLNQ.com.apple.wwdc

2. `app.json` 에 `webcredentials:example.com`을 추가해주세요.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
  "expo": {
    "ios": {
      "associatedDomains": [
        "webcredentials:example.com"
      ]
    }
  }
}
```

## 마이그레이션 가이드

***

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

#### 2.6.0

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

#### 2.5.1

2023년 9월 4일 이후에 생성된 에어브릿지 앱의 경우, 딥링크 콜백에서 제공하는 딥링크 URL 에 더이상 airbridge\_referrer 가 추가되지 않게 됩니다.

ios app 업데이트 하시는 경우, 마지막으로 계산된 SKAdNetwork Conversion Value 로 확정되고, 추가적으로 계산하지 않습니다.

* 2.5.1 미만 버전에서는 SKAdNetwork Conversion Value 를 최대 24시간 동안만 계산합니다.
* 새로 설치하시는 유저에 대해서는 문제되지 않습니다.

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

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

#### 2.5.0

trackingAuthorizeTimeout 의 기본값이 30초로 변경됩니다.

#### Update 1.x.x → 2.0.0

기존에 1 버전 에 있던 있던 이벤트 전송 API 가 삭제 되고 아래의 API 로 대체 되었습니다.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
/**
 * Send event to server.
 * @param {string} category event name
 * @param {EventOption} [option={}] event options
 */
trackEvent(category: string, option?: EventOption): void;
```

아래 가이드를 참고 부탁드립니다.

* [`마이그레이션 가이드`](https://airbridge.readme.io/page/react-native-2xx-migration-guide)

#### Update 1.0.0 → 1.1.0

아래 가이드를 참고 부탁드립니다.

* [`마이그레이션 가이드`](https://airbridge.readme.io/page/airbridge-expo-sdk-110-migration-guide)

<link rel="alternate" hrefLang="en" href="https://help.airbridge.io/en/developers/deprecated-expo-sdk-v2" />

<link rel="alternate" hrefLang="ko" href="https://help.airbridge.io/ko/developers/deprecated-expo-sdk-v2" />
