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

# Troubleshooting - Expo SDK (Deprecated)

<AccordionGroup>
  <Accordion title="[Xcode 27] Mandatory SceneDelegate Migration and Additional Airbridge Deep Link Settings">
    <Note>
      This document explains the issue caused by the mandatory adoption of `SceneDelegate` (the UIScene life cycle) in Xcode 27, and how to resolve it. The deprecated Airbridge Expo SDK also collects deep links on **Expo SDK 58 without any additional code**, but because new features and support are limited, migrating to the latest Airbridge Expo SDK is recommended.
    </Note>

    ### Symptoms

    * An app built with Xcode 27 fails to launch and quits immediately.
    * After adding `UIApplicationSceneManifest` to adopt the Scene life cycle, the app shows a blank screen and fails to render.
    * Airbridge deep link events are not collected when the app is opened through a scheme deep link or a universal link.
    * The Airbridge config plugin is set in `app.json`, but it does not work.

    ### Cause

    This is not caused by the Airbridge SDK configuration. It happens because **the Expo SDK version in use does not support the UIScene life cycle**.

    Apple is moving the app life cycle from `UIApplicationDelegate` (AppDelegate) to the `UIScene`-based (SceneDelegate) model, and **an app built with the iOS 27 SDK (Xcode 27) fails to launch and quits immediately unless it adopts the UIScene life cycle**.

    However, the prebuild template of Expo SDK 57 and earlier does not generate a `SceneDelegate` and does not add `UIApplicationSceneManifest` to `Info.plist`. Instead, the `AppDelegate` creates the `window` and starts React Native in `application:didFinishLaunchingWithOptions:`, and receives deep links through `application:openURL:` and `application:continueUserActivity:`.

    If you adopt the Scene life cycle by adding only `UIApplicationSceneManifest` in that state, those AppDelegate callbacks are no longer called under the Scene life cycle. The `window` is not displayed, which leaves a blank screen, and deep links are not delivered to the app either. The deprecated Airbridge Expo SDK collects deep links in `AirbridgeAppDelegate` (`ExpoAppDelegateSubscriber`) through the `AirbridgeRN.deeplink()` API, and that subscriber is invoked through the same AppDelegate callbacks, so Airbridge deep link collection stops as well.

    <Info>
      SDK initialization runs in `application:didFinishLaunchingWithOptions:`, which is still called under the Scene life cycle, so it is not affected. Only deep link collection stops working.
    </Info>

    ### Solution

    **Upgrade to Expo SDK 58 or later.** From Expo SDK 58, `expo prebuild` generates the `SceneDelegate` and the `UIApplicationSceneManifest` entry in `Info.plist`, and Expo forwards scene events back to the AppDelegate. As a result, even when using the deprecated SDK, **you do not need to write a `SceneDelegate` or add deep link collection code yourself.**

    <Warning>
      As of October 2026, Expo SDK 58 is still a **pre-release (beta)** and is published under the npm `next` tag, while the `latest` tag still points to Expo SDK 57. Validate it thoroughly before applying it to production. Once Expo SDK 58 is generally available, install it with `npx expo install expo@latest` instead of the `next` tag. See [npm expo versions](https://www.npmjs.com/package/expo?activeTab=versions) for versions and tags.
    </Warning>

    #### 1. Upgrade to Expo SDK 58

    ```shell lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    npx expo install expo@next
    npx expo install --fix
    ```

    To pin a specific version, specify it directly, for example `npx expo install expo@58.0.6`.

    #### 2. Check the Airbridge SDK version

    If you keep using the deprecated SDK, use the latest 2.x version.

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

    #### 3. Regenerate the native project

    ```shell lines theme={"theme":{"light":"github-dark-dimmed","dark":"github-dark-dimmed"}}
    npx expo prebuild --clean
    ```

    <Warning>
      If you commit and manage the `ios/` directory yourself (bare workflow), `npx expo prebuild --clean` overwrites the changes you applied directly to the native project. In that case, instead of running prebuild, follow the [Expo SDK upgrade guide](https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/) and apply the `SceneDelegate` and `Info.plist` `UIApplicationSceneManifest` changes to your native project yourself.
    </Warning>

    #### 4. Verify the behavior

    Open the app through a scheme deep link and a universal link, both when the app is terminated and when it is in the background, then confirm that the `airbridge.deeplink.setDeeplinkListener()` callback is invoked and that the deep link events are collected in the Airbridge dashboard.

    <Info>
      A deep link is delivered to **both** the `airbridge.deeplink.setDeeplinkListener()` callback and the React Native `Linking` `url` event. If both places perform navigation, the same link can be handled twice, so handle routing in only one place.
    </Info>

    <Info>
      The deprecated Airbridge Expo SDK no longer receives new features. To keep up with the latest iOS and Android releases and to use new features, migrate to the [latest Airbridge Expo SDK](/en/developers/expo-sdk-v4).
    </Info>
  </Accordion>

  <Accordion title="expo-route">
    If you are already using the expo-route, it will not work after installing the SDK.

    When entering the app through the Airbridge tracking link, the link you entered must be converted to a scheme deeplink through Airbridge and then routed. However, due to the expo-router, routing may be processed in the wrong direction such as duplication, wrong movement, etc.

    Therefore, the Airbridge Expo SDK has been designed to route the Deeplink.

    Please process it to route in the `airbridge.deeplink.setDeeplinkListener` as in the following code.

    ```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(...);
    });
    ```
  </Accordion>

  <Accordion title="Webcredentials">
    If you use the [Autofill](https://developer.apple.com/documentation/security/password-autofill) feature in the App to save passwords, and if the `webcredentials:...` setting is not set, the password will be saved in the domain of `applinks:YOUR_APP_NAME.airbridge.io` or `applinks:YOUR_APP_NAME.abr.ge`.

    If you want to change the domain where the password is saved, please replace `example.com` with the domain you want to set as shown below.

    1. `https://example.com/.well-known/apple-app-site-association` The following content is hosted at the address.

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

    예) 9JA89QQLNQ.com.apple.wwdc

    2. Please add `webcredentials:example.com` to `app.json`.

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


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.