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

# React Native SDK (Deprecated)

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

## SDK Installation

***

### Package Installation

###### npm

Install `airbridge-react-native-sdk` using npm.

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

###### React-native link or CocoaPods

Execute the following command.

<CodeGroup>
  ```bash >= React Native 0.60.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  cd ios
  pod install
  ```

  ```bash <= React Native 0.59.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  react-native link airbridge-react-native-sdk
  ```
</CodeGroup>

#### Project Setup

##### Import

Add the following code to the `index.js` file of the project to import the Airbridge SDK.

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

### Project Setup (Android)

###### MainApplication.java

Add the following code to the `onCreate` function within the `android/app/src/main/java/.../MainApplication.java` file.

```java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
import co.ab180.airbridge.reactnative.AirbridgeRN;

//...

@Override
public void onCreate() {
    super.onCreate();
    ...
    AirbridgeRN.init(this, "YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN");
    ...
}
```

`APP_NAME` can be found at the **"Airbridge dashboard → Settings → Tokens → App Name"**.

`APP_TOKEN` can be found at the **"Airbridge dashboard → Settings → Tokens → App SDK Token"**.

### Project Setup (iOS)

###### `AppDelegate.m`

Add the following code to the import section of the `ios/[Project Name]/AppDelegate.m` file.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  #import <AirbridgeRN/AirbridgeRN.h>
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  import AirbridgeRN
  ```
</CodeGroup>

<Danger>
  **Attention**

  Use a bridge header if you are using Swift.
</Danger>

Add the following code to the `application:idFinishLaunchingWithOptions:` function within the `ios/[Project Name]/AppDelegate.m` file.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      [AirbridgeRN getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
      ...
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
      AirbridgeRN.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
  }
  ```
</CodeGroup>

`APP_NAME` can be found at the **"Airbridge dashboard → Settings → Tokens → App Name"**.

`APP_TOKEN` can be found at the **"Airbridge dashboard → Settings → Tokens → App SDK Token"**.

### React Native Settings

##### `airbridge.json`

1. Create an `airbridge.json`file in the project folder.
2. Configure settings in JSON format.

When using React Native 0.59.X or lower with iOS, the below setup is needed for iOS.

1. Go to "Xcode → Project file → Build Phases → Copy Bundle Resources".
2. Click "+" and add `airbridge.json` file.

###### Example

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

<Danger>
  **Attention**

  `trackingAuthorizeTimeoutSeconds` in the above code is the default value. Please adjust accordingly depending on your user experience and ATT prompt settings. Please refer to [Tracking Authorize Timeout Settings](#tracking-authorize-timeout-ios-only) for more details.
</Danger>

| Name                            | Type    | Default | Description                                                                                                                                                                                                                     |
| ------------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sessionTimeoutSeconds           | Number  | 300     | An app open event will not be sent when the app is reopened within the designated period.                                                                                                                                       |
| autoStartTrackingEnabled        | Boolean | true    | When set to false, no events will be sent until<br />`Airbridge.state.startTracking()`<br />is called.                                                                                                                          |
| userInfoHashEnabled             | Boolean | true    | When set to false, user email and user phone information are sent without being hashed.                                                                                                                                         |
| trackAirbridgeLinkOnly          | Boolean | false   | When set to true, deep link events are sent only when app is opened with an Airbridge deep link.                                                                                                                                |
| facebookDeferredAppLinkEnabled  | Boolean | false   | When set to true and the Facebook SDK is installed, Facebook Deferred App Link data is collected.                                                                                                                               |
| locationCollectionEnabled       | Boolean | false   | When set to true, location information is collected. (Android Only)<br />Two permissions must be allowed in AndroidManifest.xml<br />android.permission.ACCESS\_FINE\_LOCATION<br />android.permission.ACCESS\_COARSE\_LOCATION |
| trackingAuthorizeTimeoutSeconds | Number  | 0       | When timeout is set, Install event is delayed until<br />`Request tracking authorization alert`<br />is clicked. (iOS only)                                                                                                     |
| sdkSignatureSecretID            | String  | null    | Protects against SDK spoofing. Both sdkSignatureSecretID and sdkSignatureSecret values must be applied.                                                                                                                         |
| sdkSignatureSecret              | String  | null    | Protects against SDK spoofing. Both sdkSignatureSecretID and sdkSignatureSecret values must be applied.                                                                                                                         |
| logLevel                        | String  | Warning | Adjusts the log record level for Airbridge.<br />logLevel: "debug" \| "info" \| "warning" \| "error" \| "fault"                                                                                                                 |

### Testing the SDK

Check if install events are sent when the application is installed and opened.

###### Check in the Airbridge Dashboard

Events from the Airbridge SDK are shown at the "Airbridge Dashboard → Raw Data → App Real-time Logs".

1. Go to the "Airbridge Dashboard → Raw Data → App Real-time Logs".
2. Search for the device's ADID (IDFA, IDFV, GAID).

Logs may be delayed for up to 5 minutes.

## Deep Link Setup

***

### Dashboard Setup

Please refer to the following guides for setting up deep links in the Airbridge dashboard.

* [Deep link setup for Android](/en/developers/deprecated-android-sdk-v2#dashboard-setup)
* [Deep link setup for iOS](/en/developers/deprecated-ios-sdk-v1#dashboard-setup)

### Project Setup

###### setDeeplinkListener

Register a function that will be called whenever a deep link or a deferred deep link opens the application.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.deeplink.setDeeplinkListener((deeplink) => {
    // code that will run when a deep link or deferred deep link occurs
    // deeplink = YOUR_SCHEME://...

    console.log(deeplink);
});
```

All deep links that open apps are sent to `DeeplinkCallback`

Of those deep links, "Airbridge deep links" will be sent using the URI Scheme (`YOUR_SCHEME://...`) that was set in the Airbridge dashboard.

### Project Setup (Android)

###### AndroidManifest.xml

In the `MainActivity` section of the `android/app/src/main/AndroidManifest.xml` file, add `android:LaunchMode` and `intent-filter` parameters as below.

```xml lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
<activity android:name=".MainActivity"
    android:launchMode="singleTask"
    ...>
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http" android:host="YOUR_APP_NAME.deeplink.page" />
        <data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
    </intent-filter>
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
        <data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data android:scheme="YOUR_SCHEME" />
    </intent-filter>
    ...
<activity/>
```

Enter your app name at `APP_NAME`.

Enter your scheme value set in the Airbridge dashboard at `YOUR_SCHEME`.

###### MainActivity.java

Insert the following code in the `android/app/src/main/java/.../MainActivity.java` file.

```java lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
@Override
protected void onResume() {
    super.onResume();

    AirbridgeRN.processDeeplinkData(getIntent());
}

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
```

### Project Setup (iOS)

###### Scheme

1. Go to "Xcode → Project file → Info → URL Types".
2. From the Airbridge dashboard, copy "iOS URI Scheme" to Xcode's "URL Schemes". (Do not include`://`)

##### Universal Link

1. Go to "Xcode → Project file → Signing & Capabilities".
2. Click "+ Capability" and add "Associated Domains".
3. Add `applinks:YOUR_APP_NAME.airbridge.io`to "Associated Domains".
4. Add `applinks:YOUR_APP_NAME.deeplink.page`to "Associated Domains".

`YOUR_APP_NAME` can be found at the "Airbridge dashboard → Settings → Tokens → App Name".

Please refer to [Troubleshooting → Webcredentials](/en/developers/deprecated-ios-sdk-v1#webcredentials) if you want to use the autofill feature.

###### Send Deep Link Information to SDK

1. Open `ios/[Project name]/AppDelegate`.

2. Send deeplink information to the SDK when the application is opened through schemes by calling the `handleURLSchemeDeeplink`method at the beginning of the following function.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication *)application
              openURL:(NSURL *)url
              options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
  {
      NSLog(@"openURL : %@", url);

      [AirbridgeRN.deeplink handleURLSchemeDeeplink:url];

      return YES;
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ app: UIApplication,
                   open url: URL,
                   options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
  {
      NSLog(@"openURL : %@", url)

      AirbridgeRN.deeplink().handleURLSchemeDeeplink(url)
      
      return true
  }
  ```
</CodeGroup>

3. When targeting iOS 8.x or earlier, also call the `handleURLSchemeDeeplink`method at the beginning of the following function.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  - (BOOL)application:(UIApplication*)application
              openURL:(NSURL*)url
    sourceApplication:(NSString*)sourceApplication 
           annotation:(id)annotation
  {
      NSLog(@"openURL : %@", url);

      [AirbridgeRN.deeplink handleURLSchemeDeeplink:url];

      return YES;
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   open url: URL,
                   sourceApplication: String?,
                   annotation: Any) -> Bool
  {
      NSLog(@"openURL : %@", url)

      AirbridgeRN.deeplink().handleURLSchemeDeeplink(url);
      
      return true;
  }
  ```
</CodeGroup>

4. Send deep link information to the SDK when the application is opened through an universal link by calling the `handleUserActivity`method at the beginning of the following function.

<CodeGroup>
  ```objective-c Objective-C lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  -  (BOOL)application:(UIApplication*)application
  continueUserActivity:(NSUserActivity*)userActivity
    restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
  {
      NSLog(@"continueUserActivity : %@", userActivity.webpageURL);

      [AirbridgeRN.deeplink handleUserActivity:userActivity];

      return YES;
  }
  ```

  ```swift Swift lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                   restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
  {
      AirbridgeRN.deeplink().handle(userActivity)
      
      return true
  }
  ```
</CodeGroup>

### Custom Domain Setup (Optional)

Please refer to the below guides to setup your custom domain with Airbridge.

iOS: [Guide](/en/developers/deprecated-ios-sdk-v1#custom-domain-setting-optional)

Android: [Guide](/en/developers/deprecated-android-sdk-v2#custom-domain-setup)

### Test Deep Link

Click on your URI scheme to test if your deep link has been properly set up in the Airbridge SDK.

* `YOUR_APP_URI_SCHEME://`

The results will show on the "Airbridge dashboard → Row Data → App Real-time Log" tab if everything is working.

## User Setup

***

### User Identifier Setup

Once a user identifier information is sent to the SDK, all events thereafter will contain the corresponding user identifier information.

| Name       | Description       | Limitations                                                                                                                                                                                                                       |
| ---------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ID         | User ID           | -                                                                                                                                                                                                                                 |
| email      | User Email        | Hashed by default<br />(SHA256, can be disabled)                                                                                                                                                                                  |
| phone      | User phone number | Hashed by default<br />(SHA256, can be disabled)                                                                                                                                                                                  |
| attributes | User attributes   | - Maximum 100 attributes<br />- "key" type is string, maximum 128 characters<br />- "key" must satisfy `^[a-z_][a-z0-9_]*$`regex<br />- "value" type is primitive or string<br />- Maximum 1024 characters when "value" is string |
| alias      | Another User ID   | - Maximum 10 aliases<br />-`"key"`type is String, maximum 128 characters<br />-`"key"`must satisfy `^[a-z_][a-z0-9_]*$`regex<br />- \`"value" type is String, maximum 1024 characters                                             |

###### Example

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.state.setUser({
    ID: 'persondoe1',
    email: 'persondoe1@example.com',
});

Airbridge.state.setUser({
    email: 'persondoe2@example.com',
    phone: '+14151231234',
});

Airbridge.state.updateUser({
    ID: 'persondoe3',
});
```

The above code operates in the following order.

1. User = \{ ID: 'personID1', email: 'persondoe1<span>@</span>airbridge.io' }
2. User = \{ ID: 'personID1', email: 'persondoe1<span>@</span>airbridge.io', phone: '1(123)123-1234' }
3. User = \{ ID: 'personID3', email: 'persondoe2<span>@</span>airbridge.io', phone: '1(123)123-1234)' }

### User Attribute Setup

Additional user attributes can be set for various purposes such as MTA (Multi-Touch Attribution) analysis, internal data analysis and 3rd party solution integrations.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.state.updateUser({
    attributes: {
      age_group: "30",
      gender: "Female"
    }
});
```

### Testing

Make sure that your user information settings are being properly sent through the SDK.

1. Configure user identifier information.
2. Send an event using the SDK.
3. Click the event at "Airbridge dashboard → Raw Data → App Real-time Logs"
4. Check if the user information is correctly sent under the `user`block.

## Device Setup

***

### Setup Device Alias

Setup a device alias through the Airbridge SDK. The alias will be sustained even after the app closes, unless otherwise deleted.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
Airbridge.clearDeviceAlias();
```

| `setDeviceAlias(key: string, value: string)` | Add the key value pair to the device identifier. |
| -------------------------------------------- | ------------------------------------------------ |
| `removeDeviceAlias(key: string)`             | Delete the corresponding device alias.           |
| `clearDeviceAlias()`                         | Delete all device aliases.                       |

## Event Setup

***

When important user actions occur, in-app events can be sent to measure the performance of each channel.

All event parameters are optional. However, more information about the event will help provide a more accurate analysis.

`action`, `label`, `value`, `customAttributes` and `semanticAttributes` can be used for event options.

```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;
```

### User Events

Send user events with the SDK.

`action`, `label`, `value`, `customAttributes` and `semanticAttributes` can be used for user events.

###### Sign Up

User identifiers are set with `setUser` and then sent with `AirbridgeCategory.SIGN_UP` for user sign ups.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.state.setUser({
    ID: 'test',
    email: 'test@ab180.co',
    phone: '000-0000-0000',
});
Airbridge.trackEvent(AirbridgeCategory.SIGN_UP);
```

#### Sign In

User identifiers are set with `setUser` and then sent with `AirbridgeCategory.SIGN_IN` for user logins.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.state.setUser({
    ID: 'test',
    email: 'test@ab180.co',
    phone: '000-0000-0000',
});
Airbridge.trackEvent(AirbridgeCategory.SIGN_IN);
```

###### Sign Out

Send the sign out event with `AirbridgeCategory.SIGN_OUT`, and then reset the user identifiers with `Airbridge.state.setUser({})`.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.SIGN_OUT);
Airbridge.state.setUser({});
```

### E-commerce Events

###### Send e-commerce events with the SDK.

`action`, `label`, `value`, `customAttributes` and `semanticAttributes` can be used for e-commerce events.

It is possible to include product information using `semanticAttributes`. Custom key values can be used along with the pre-defined values.

###### View Home Screen

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.HOME_VIEW);
```

###### View Product Detail

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.PRODUCT_DETAILS_VIEW, {
    semanticAttributes: {
        [AirbridgeAttributes.PRODUCTS]: [
            {
                [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                [AirbridgeProduct.NAME]: 'Coke Zero',
                [AirbridgeProduct.PRICE]: 1.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 1,
                [AirbridgeProduct.QUANTITY]: 1,
            },
        ]
    }
});
```

###### View Product List

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.PRODUCT_LIST_VIEW, {
    semanticAttributes: {
        [AirbridgeAttributes.PRODUCT_LIST_ID]: 'ID-1234567890'
        [AirbridgeAttributes.PRODUCTS]: [
            {
                [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                [AirbridgeProduct.NAME]: 'Coke Zero',
                [AirbridgeProduct.PRICE]: 1.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 1,
                [AirbridgeProduct.QUANTITY]: 1,
            },
            {
                [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                [AirbridgeProduct.PRICE]: 3.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 2,
                [AirbridgeProduct.QUANTITY]: 1,
            },
        ]
    }
});
```

###### View Search Result

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.SEARCH_RESULT_VIEW, {
    semanticAttributes: {
        [AirbridgeAttributes.QUERY]: 'product'
        [AirbridgeAttributes.PRODUCTS]: [
            {
                [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                [AirbridgeProduct.NAME]: 'Coke Zero',
                [AirbridgeProduct.PRICE]: 1.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 1,
                [AirbridgeProduct.QUANTITY]: 1,
            },
            {
                [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                [AirbridgeProduct.PRICE]: 3.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 2,
                [AirbridgeProduct.QUANTITY]: 1,
            },
        ]
    }
});
```

###### Add to Cart

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.ADD_TO_CART, {
    value: 5.98,
    semanticAttributes: {
        [AirbridgeAttributes.CART_ID]: 'ID-1234567890',
        [AirbridgeAttributes.CURRENCY]: 'USD',
        [AirbridgeAttributes.PRODUCTS]: [
            {
                [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                [AirbridgeProduct.NAME]: 'Coke Zero',
                [AirbridgeProduct.PRICE]: 1.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 1,
                [AirbridgeProduct.QUANTITY]: 1,
            },
            {
                [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                [AirbridgeProduct.PRICE]: 3.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 2,
                [AirbridgeProduct.QUANTITY]: 1,
            },
        ]
    }
});
```

###### Purchase

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED, {
    value: 5.98,
    semanticAttributes: {
        [AirbridgeAttributes.TRANSACTION_ID]: 'transactionID-purchase',
        [AirbridgeAttributes.CURRENCY]: 'USD',
        [AirbridgeAttributes.IN_APP_PURCHASED]: true,
        [AirbridgeAttributes.PRODUCTS]: [
            {
                [AirbridgeProduct.PRODUCT_ID]: 'coke_zero',
                [AirbridgeProduct.NAME]: 'Coke Zero',
                [AirbridgeProduct.PRICE]: 1.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 1,
                [AirbridgeProduct.QUANTITY]: 1,
            },
            {
                [AirbridgeProduct.PRODUCT_ID]: 'burger_cheese_double',
                [AirbridgeProduct.NAME]: 'Double Cheeseburger',
                [AirbridgeProduct.PRICE]: 3.99,
                [AirbridgeProduct.CURRENCY]: 'USD',
                [AirbridgeProduct.POSITION]: 2,
                [AirbridgeProduct.QUANTITY]: 1,
            },
        ]
    }
});
```

### Verify Event Transmission

Make sure that the events are being properly sent through the SDK.

1. Send an event with the SDK.
2. Check if the event shows up at "Airbridge dashboard → Raw Data → Web Real-time Logs".

## Advanced Setup

***

### Install Restricted SDK

Restricted SDK does not collect device IDs, including Ad ID. The restricted SDK will be available starting from `v2.5.3`.

#### Install using NPM

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

#### Install react-native link or CocoaPods

<CodeGroup>
  ```bash >= React Native 0.60.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  cd ios
  pod install
  ```

  ```bash <= React Native 0.59.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  react-native link airbridge-react-native-sdk-restricted
  ```
</CodeGroup>

#### Setup Project

Obtain the object in the project's index.js file with the following code.

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

### SDK Signature Setup

Protection against SDK spoofing is possible once you set your SDK Signature.

This feature is available for the Airbridge React Native SDK v2.3.0 and above.

* Add the following lines in the `airbridge.json` file.

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

<Note>
  The SDK Signature Credentials are required for the SDK Signature setup. Refer to this [article](/en/guides/sdk-signature#configuring-the-sdk-signature-credentials) to learn how to create them.
</Note>

#### Session Timeout

Configure the `sessionTimeoutSeconds` parameter of [`airbridge.json`](#airbridge-json). App open events will not be sent again if the user re-opens the app within the `sessionTimeoutSeconds` value.

Session timeout is in milliseconds and must range between 0 and 604800000 (7 days).

Default value is 1000 \* 60 \* 5 (5 minutes).

#### Hash User Indentifier

Email addresses and phone numbers are hashed by default. (SHA256)

You can stop hashing email and phone information by configuring the `userInfoHashEnabled` parameter of [`airbridge.json`](#airbridge-json).

<Note>
  You must take appropriate measures internally when personal information is not hashed.
</Note>

### Track Facebook Deferred App Links

The Airbridge SDK can track Facebook Deferred App Links by utilizing the `facebookDeferredAppLinkEnabled` parameter of [`airbridge.json`](#airbridge-json).

1. Install the Facebook SDK:

[https://developers.facebook.com/docs/ios/getting-started](https://developers.facebook.com/docs/ios/getting-started).

2. Set `facebookDeferredAppLinkEnabled`of [`airbridge.json`](#airbridge-json) to `true`.

<Danger>
  **Attention**

  The Facebook SDK must be configured beforehand. [Reference](https://developers.facebook.com/docs/app-ads/sdk-setup/)
</Danger>

### Track Airbridge Deep Links Only

The SDK will send all deep link events when the app is opened using a deep link.

If you're having difficulty tracking the re-engagement performance due to various deep link actions within the app, set `trackAirbridgeLinkOnly` of [`airbridge.json`](#airbridge-json) to true. The SDK will only send deep link events that use Airbridge deep links.

Airbridge deep links are defined as...

* Deep links registered on the Airbridge dashboard
* `airbridge.io`deep links
* `deeplink.page`deep links
* Contains the `airbridge_referrer`query information

### Privacy Protection (Opt-Out)

When `autoStartTrackingEnabled` of [`airbridge.json`](#airbridge-json) is set to false, the Airbridge SDK will not send events to the Airbridge server until the `Airbridge.state.startTracking` method is called.

This feature is useful for compliances such as [GDPR](https://gdpr-info.eu/) and [CCPA](https://oag.ca.gov/privacy/ccpa).

### Tracking Authorize Timeout (iOS only)

When the [AppTrackingTransparency.framework](https://developer.apple.com/documentation/apptrackingtransparency) is used to present an app-tracking authorization request to the user, IDFA will not be collected when the install event occurs because the install event occurs before the selection.

When `trackingAuthorizeTimeoutSeconds` of [`airbridge.json`](#airbridge-json) is set to true, the install event will be sent after the `timeout` period or delayed until an ATT option is selected.

### Location Tracking (Android Only)

Track a user's location through the `locationCollectionEnabled` parameter of the [`airbridge.json`](#airbridge-json) file.

```xml lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
```

<Danger>
  **Attention**

  Location information must be collected for legal purposes only.
</Danger>

### Tracking Link Execution

Use the code below to execute and track deep links in the app.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.placement.click('https://abr.ge/~~~', 'ablog://main', 'https://airbridge.io');
Airbridge.placement.impression('https://abr.ge/~~~');
```

###### `click`

The `click` function adds a "click" statistic to the corresponding tracking link, then moves to the pre-set app, web or fallback.

Call the `click` function when the tracking link is clicked on.

The deep link and fallback are "backup links" used when there is no Internet connection.

Deep link parameters are only available in Custom URL Scheme format.

(All these parameters are optional)

###### `impression`

The `impression` function adds an "impression" statistic to the corresponding tracking link.

Call the `impression` function when the tracking is displayed.

<Danger>
  **Attention**

  If you are using a "custom domain" for your tracking link, it can not be used with a "custom short ID".

  * example: `https://deeplink.customdomain.com/custom` -> Not possible
  * example: `https://deeplink.customdomain.co/autogenerated` -> Possible
  * example: `https://abr.ge/autogenerated` -> Possible
</Danger>

### **Get deviceUUID**

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
await Airbridge.state.deviceUUID()
```

### **Uninstall tracking**

<Note>
  This feature is available only for React Native SDK v2.1.0+.

  * Airbridge Android SDK v2.6.0+
  * Airbridge iOS SDK v1.28.2+
</Note>

Please refer to [this guide](/en/guides/uninstall-event-tracking) for details.

###### Send Push Token

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Airbridge.registerPushToken(token);
```

Forward the push token to Airbridge using the `registerPushToken` method.

Make sure the notification is not shown on the device if the remote message value is `airbridge-uninstall-tracking`.

## Hybrid App Setup

***

Additional events such as app installs, app open and deep link opens can't be tracked with just the web SDK. The following simple setup allows in-app events to be called for a hybrid app.

```javascript lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
let webInterface = Airbridge.createWebInterface(
        'YOUR_WEB_TOKEN',
        (command) => { 
            return `...`;
        }
    )
```

`Airbridge.CreateWebInterface` allows you to control the web interface.

Please refer to the guide below for more information.

* [React Native Hybrid App Integration Guide](https://airbridge.readme.io/v1.1-en/page/react-native-hybrid-app-integration-guide)

## Troubleshooting

***

### Update 1.X.X → 2.X.X

The event API has been replaced to the below.

```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;
```

Refer to the [React native 2.X.X migration guide](https://airbridge.readme.io/v1.1-en/page/react-native-2xx-migration-guide-1) for details.

### Bitcode Compile Error

An error like below may occur when creating iOS builds with React Native SDK v1.5.0+.

```html lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
ld: XCFrameworkIntermediates/AirBridge/AirBridge.framework/AirBridge(AirBridge-arm64-master.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE)
```

Since React Native SDK v1.5.0+ uses Airbridge iOS SDK v1.28.0+, Bitcode is no longer supported. Please refer to the [Bitcode compile error guide](/en/developers/deprecated-ios-sdk-v1#bitcode-compile-error) for more details.

### Resolve Airbridge SDK backup rules merge conflict issue

* Reference : [Android SDK Auto Backup](/en/developers/deprecated-android-sdk-v2#auto-backup)

If you are experiencing build errors caused by overlapping of the Airbridge SDK backup rules and third-party SDK backup rules, please refer to the workaround below.

e.g) If you have an Airbridge SDK backup rule and an Appsflyer SDK backup rule that overlap, you will see the build error below.

```html lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
Attribute application@fullBackupContent value=(@xml/appsflyer_backup_rules) from [com.appsflyer:af-android-sdk:6.6.1] AndroidManifest.xml:14:18-73
is also present at [io.airbridge:sdk-android:2.14.0] AndroidManifest.xml:27:18-78 value=(@xml/airbridge_auto_backup_rules).
Suggestion: add 'tools:replace="android:fullBackupContent"' to <application> element at AndroidManifest.xml:7:5-13:19 to override.
```

To resolve this issue, please set up as follows.

<AccordionGroup>
  <Accordion title="backup_rules.xml setup">
    1. Create a `android/app/src/main/res/xml` folder.
    2. Within the created xml folder, create a file (e.g. `custom_backup_rules.xml`).
    3. Add the data backup rules defined in the Airbridge SDK as follows.

    ```xml lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <!-- Airbridge Backup Rules -->
        <exclude domain="sharedpref" path="airbridge-internal" />
        <exclude domain="sharedpref" path="airbridge-install" />
        <exclude domain="sharedpref" path="airbridge-user-info" />
        <exclude domain="sharedpref" path="airbridge-user-alias" />
        <exclude domain="sharedpref" path="airbridge-user-attributes" />
        <exclude domain="sharedpref" path="airbridge-device-alias" />
        <exclude domain="database" path="airbridge.db" />
      
        <!-- Appsflyer Backup Rules -->
        <exclude domain="sharedpref" path="appsflyer-data"/>

        <!-- Your Custom Backup Rules -->
    </full-backup-content>
    ```
  </Accordion>

  <Accordion title="AndroidManifest.xml setup">
    ```xml lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    <manifest
        ...
        xmlns:tools="http://schemas.android.com/tools">

        <application
            ...
            android:allowBackup="true"
            android:fullBackupContent="@xml/custom_backup_rules"
            tools:replace="android:fullBackupContent">
    ```
  </Accordion>
</AccordionGroup>

## Migration guide

### Update 1.1.X → 1.2.X

###### npm

Change version of Airbridge React Native SDK in `package.json`.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
...
    "airbridge-react-native-sdk": "1.2.1",
...
```

Execute the following command.

<CodeGroup>
  ```bash >= React Native 0.60.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  npm install
  cd ios
  pod install
  ```

  ```bash <= React Native 0.59.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  npm install
  react-native link airbridge-react-native-sdk
  ```
</CodeGroup>

###### Android

1. Modify `android/app/src/main/java/.../MainActivity`

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
-     AirbridgeRN.getDeeplink().fetch(getIntent())
+     AirbridgeRN.processDeeplinkData(getIntent())
```

###### iOS

1. Modify `ios/[Project Name]/AppDelegate`

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
-     AirbridgeRN.deeplink().handleURLSchemeDeeplink(url, withSourceBundle: sourceApplication)
+     AirbridgeRN.deeplink().handleURLSchemeDeeplink(url)
```

###### Settings

1. Add an `airbridge.json`file to the project folder.
2. Add the parameters shown in the example below in JSON format.

```json lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
{
    "sessionTimeoutSeconds": 300,
    "autoStartTrackingEnabled": true,
    "userInfoHashEnabled": true,
    "trackAirbridgeLinkOnly": false,
    "facebookDeferredAppLinkEnabled": false,
    "locationCollectionEnabled": false
}
```

###### Description

| Name                            | Type    | Default | Description                                                                                                                                                                                                                 |
| ------------------------------- | ------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sessionTimeoutSeconds           | number  | 300     | An app open event will not be sent when the app is reopened within the designated period.                                                                                                                                   |
| autoStartTrackingEnabled        | boolean | true    | When set to false, no events will be sent until `airbridge.state.startTracking()` is called.                                                                                                                                |
| userInfoHashEnabled             | boolean | true    | When set to false, user email and user phone information are sent without being hashed.                                                                                                                                     |
| trackAirbridgeLinkOnly          | boolean | false   | When set to true, deep link events are sent only when app is opened with an Airbridge deep link.                                                                                                                            |
| facebookDeferredAppLinkEnabled  | boolean | false   | When set to true and the Facebook SDK is installed, Facebook Deferred App Link data is collected.                                                                                                                           |
| locationCollectionEnabled       | boolean | false   | When set to true, location information is collected. (Android Only)<br />Two permissions must be allowed in `AndroidManifest.xml`android.permission.ACCESS\_FINE\_LOCATION<br />android.permission.ACCESS\_COARSE\_LOCATION |
| trackingAuthorizeTimeoutSeconds | number  | 0       | When set timeout, Install event is delayed until Request tracking authorization alert is clicked. (iOS only)                                                                                                                |

### Update 1.0.X → 1.1.X

###### Installation

Uninstall the old version of the Airbridge SDK.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
npm uninstall react-native-airbridge-bridge
```

Install the new version of the Airbridge SDK.

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

After Installation, execute the following command.

<CodeGroup>
  ```bash >= React Native 0.60.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  cd ios
  pod install
  ```

  ```bash < React Native 0.60.X lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
  react-native link airbridge-react-native-sdk
  ```
</CodeGroup>

**`setDeeplinkListener`**

Remove the `getInitialDeeplink` function and use the `setDeeplinkListener` function only.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
- Airbridge.deeplink.getInitialDeeplink().then((deeplink) => {
-
- });
. 
. Airbridge.deeplink.setDeeplinkListner((deeplink) => {
. 
. });
```

###### Android

**`AndroidManifest.xml`**

In the `MainActivity` section of the `android/app/src/main/AndroidManifest.xml` file, add `intent-filter` parameters as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
+ <intent-filter android:autoVerify="true">
+     <action android:name="android.intent.action.VIEW" />
+
+     <category android:name="android.intent.category.DEFAULT" />
+     <category android:name="android.intent.category.BROWSABLE" />
+
+     <data android:scheme="http" android:host="YOUR_APP_NAME.deeplink.page" />
+     <data android:scheme="https" android:host="YOUR_APP_NAME.deeplink.page" />
+ </intent-filter>
. <intent-filter android:autoVerify="true">
.     <action android:name="android.intent.action.VIEW" />
. 
.     <category android:name="android.intent.category.DEFAULT" />
.     <category android:name="android.intent.category.BROWSABLE" />
. 
.     <data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
.     <data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
. </intent-filter>
. <intent-filter>
.     <action android:name="android.intent.action.VIEW" />
. 
.     <category android:name="android.intent.category.DEFAULT" />
.     <category android:name="android.intent.category.BROWSABLE" />
. 
.     <data android:scheme="EXAMPLE_SCHEME" />
. </intent-filter>
```

**`MainActivity.java`**

Modify `android/app/src/main/java/.../MainActivity.java` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. import co.ab180.airbridge.reactnative.AirbridgeRN;
. 
. public class MainActivity extends ReactActivity {
+     @Override
+     protected void onResume() {
+         super.onResume();
+ 
+         AirbridgeRN.getDeeplink().fetch(getIntent());
+     }
+  
.     @Override
.     public void onNewIntent(Intent intent) {
.         super.onNewIntent(intent);
.         setIntent(intent);
.     }
. }
```

###### iOS

###### Universal Link

1. Go to "Xcode → Project file → Signing & Capabilities".
2. Click "+ Capability" and add "Associated Domains".
3. Add `applinks:YOUR_APP_NAME.deeplink.page`to "Associated Domains"

<Note>
  `YOUR_APP_NAME` can be found on the **\[Settings]>\[Token]** page in the Airbridge dashboard.
</Note>

###### AppDelegate.m\`

Modify `ios/.../AppDelegate.m` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. - (BOOL)application:(UIApplication *)application
.             openURL:(NSURL *)url
.             options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
. {
-     [AirbridgeRN.instance handleURLSchemeDeeplink:url
-                                withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
+     [AirbridgeRN.deeplink handleURLSchemeDeeplink:url
+                                withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
. 
.     return YES;
. }
. 
. - (BOOL)application:(UIApplication*)application
.             openURL:(NSURL*)url
.   sourceApplication:(NSString*)sourceApplication 
.          annotation:(id)annotation
. {
-     [AirbridgeRN.instance handleURLSchemeDeeplink:url
-                                withSourceBundle:sourceApplication];
+     [AirbridgeRN.deeplink handleURLSchemeDeeplink:url
+                                withSourceBundle:sourceApplication];
. 
.     return YES;
. }
```

When targeting iOS 8.x or earlier, also make the following changes.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. -  (BOOL)application:(UIApplication*)application
. continueUserActivity:(NSUserActivity*)userActivity
.   restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
. {
-     [AirbridgeRN.instance handleUniversalDeeplink:userActivity.webpageURL];
+     [AirbridgeRN.deeplink handleUniversalLink:userActivity.webpageURL];
. 
.     return YES;
. }
```

### Update 0.2.X → 1.X.X

###### Reinstalling the Airbridge SDK

Unlink the old version of the SDK.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
react-native unlink react-native-airbridge-bridge
```

Follow the steps below when an error occurs with `react-native unlink react-native-airbridge-bridge`

1. (Android) Modify `android/app/src/main/java/.../MainApplication.java`as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
- import com.reactlibrary.AirbridgeBridgePackage;
```

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. @Override
. protected List<ReactPackage> getPackages() {
.     return Arrays.<ReactPackage>asList(
+         new MainReactPackage()
-         new MainReactPackage(),
-         new AirbridgeBridgePackage()
.     );
. }
```

2. (iOS) Open `ios/xxx.xcodeproj`.
3. (iOS) Remove `AirbridgeBridge.xcodeproj`in `Libraries`

Uninstall the old version of the SDK.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
npm uninstall react-native-airbridge-bridge
```

Install the new version of the SDK.

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

Link the new version of the SDK.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
react-native link airbridge-react-native-sdk
```

**`index.js`**

Modify `index.js` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
- const Airbridge = require('react-native-airbridge-bridge');
+ import Airbridge from 'airbridge-react-native-sdk';
```

**`build.gradle`** **(Android)**

Modify `android/app/build.gradle` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. dependencies {
.     ...
-     implementation 'io.airbridge:sdk-android:1.5.+'
-     implementation 'com.android.installreferrer:installreferrer:1.0'
.     ...
. }
```

**`AndroidManifest.xml`** **(Android)**

Modify `android/app/src/main/AndroidManifest.xml` as below.

###### `permission` (Android)

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
-     <uses-permission android:name="android.permission.INTERNET" />
-     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

###### MainActivity

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
.     <activity android:name=".MainActivity"
          ...
+         android:launchMode="singleTask">
```

**`MainApplication.java`** **(Android)**

Modify `android/app/src/main/java/.../MainApplication.java` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
- import io.airbridge.*;
```

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. @Override
. public void onCreate() {
.     super.onCreate();
-     AirBridge.init(this, "[앱 이름]", "[앱 토큰]");
+     AirbridgeRN.init(this, "[앱 이름]", "[앱 토큰]");
.     ...
. }
```

**`MainActivity.java`** **(Android)**

Modify `android/app/src/main/java/.../MainActivity.java` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
+ import co.ab180.airbridge.reactnative.AirbridgeRN;

+ public class MainActivity extends ReactActivity {
+   @Override
+   public void onNewIntent(Intent intent) {
+       super.onNewIntent(intent);
+       setIntent(intent);
+   }
+ }
```

**`Podfile`** **(iOS)**

Modify `ios/Podfile` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
target '[Project Name]' do
-   pod 'AirBridge', '1.6.2'
end
```

Run the command below in terminal.

```bash lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
pod install
```

**`AppDelegate.m`** **(iOS)**

Modify `ios/.../AppDelegate.m` as below.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
- #import <AirBridge/AirBridge.h>
+ #import <AirbridgeRN/AirbridgeRN.h>
```

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
.           - (BOOL)application:(UIApplication *)application 
. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
. {
-     [AirBridge getInstance:@"YOUR_APP_SDK_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];
+     [AirbridgeRN getInstance:@"YOUR_APP_SDK_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];
.     ...
. }
```

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. - (BOOL)application:(UIApplication *)application
.             openURL:(NSURL *)url
.             options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
. {
-     [[AirBridge instance] handleURL:url];
+     [AirbridgeRN.instance handleURLSchemeDeeplink:url withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];.
.
.     return YES;
. }
```

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
. - (BOOL)application:(UIApplication *)application 
.             openURL:(NSURL *)url
.   sourceApplication:(NSString *)sourceApplication 
.          annotation:(id)annotation
. {
-     [[AirBridge instance] handleURL:url];
+     [AirbridgeRN.instance handleURLSchemeDeeplink:url withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
. 
.     return YES;
. }
```

When targeting iOS 8.x or earlier, also make the following changes.

```diff lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
.   - (BOOL)application:(UIApplication *)application 
.  continueUserActivity:(NSUserActivity *)userActivity
.    restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
. {
-     [[AirBridge instance] handleURL:url];
+     [AirbridgeRN.instance handleUniversalDeeplink:userActivity.webpageURL];
. 
.     return YES;
. }
```

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

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