[Xcode 27] Mandatory SceneDelegate Migration and Additional Airbridge Deep Link Settings
[Xcode 27] Mandatory SceneDelegate Migration and Additional Airbridge Deep Link Settings
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.Symptoms
- An app built with Xcode 27 fails to launch and quits immediately.
- After adding
UIApplicationSceneManifestto 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 fromUIApplicationDelegate (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.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.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.1. Upgrade to Expo SDK 58
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.3. Regenerate the native project
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 theairbridge.deeplink.setDeeplinkListener() callback is invoked and that the deep link events are collected in the Airbridge dashboard.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.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.
expo-route
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.Webcredentials
Webcredentials
If you use the Autofill feature in the App to save passwords, and if the 예) 9JA89QQLNQ.com.apple.wwdc
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.https://example.com/.well-known/apple-app-site-associationThe following content is hosted at the address.
- Please add
webcredentials:example.comtoapp.json.