From 0f7fbd8063f5d6fa99e324056cc0e22d360e80d3 Mon Sep 17 00:00:00 2001 From: artus9033 Date: Fri, 13 Mar 2026 12:39:27 +0100 Subject: [PATCH 1/2] feat: support linking in Expo --- .../ios/ExpoHostRuntime.swift | 19 ++++++++++++++ .../ios/ReactNativeBrownfield.swift | 25 +++++++++++++++++++ .../ios/ReactNativeHostRuntime.swift | 16 ++++++++++++ 3 files changed, 60 insertions(+) diff --git a/packages/react-native-brownfield/ios/ExpoHostRuntime.swift b/packages/react-native-brownfield/ios/ExpoHostRuntime.swift index 30038e09..be078ad0 100644 --- a/packages/react-native-brownfield/ios/ExpoHostRuntime.swift +++ b/packages/react-native-brownfield/ios/ExpoHostRuntime.swift @@ -96,6 +96,25 @@ final class ExpoHostRuntime { ) != nil } + // Linking API; base implementation courtesy of Expo, licensed under the MIT License - changes were made to call the method on expo delegate - https://github.com/expo/expo/blob/main/apps/bare-expo/ios/AppDelegate.swift + func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + return (expoDelegate?.application(app, open: url, options: options) ?? false) || RCTLinkingManager.application(app, open: url, options: options) + } + + // Universal Links; base implementation courtesy of Expo, licensed under the MIT License - changes were made to call the method on expo delegate - https://github.com/expo/expo/blob/main/apps/bare-expo/ios/AppDelegate.swift + func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + let result = RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) + return (expoDelegate?.application(application, continue: userActivity, restorationHandler: restorationHandler) ?? false) || result + } + func view( moduleName: String, initialProps: [AnyHashable: Any]?, diff --git a/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift b/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift index f03203f0..35a2559f 100644 --- a/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift +++ b/packages/react-native-brownfield/ios/ReactNativeBrownfield.swift @@ -122,6 +122,31 @@ internal import Expo #endif } + @objc public func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + #if canImport(Expo) + return ExpoHostRuntime.shared.application(app, open: url, options: options) + #else + return ReactNativeHostRuntime.shared.application(app, open: url, options: options) + #endif + } + + // Universal Links + @objc public func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + #if canImport(Expo) + return ExpoHostRuntime.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + #else + return ReactNativeHostRuntime.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + #endif + } + /** * Starts React Native with optional callback when bundle is loaded. * diff --git a/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift b/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift index f6715a81..f3f467fb 100644 --- a/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift +++ b/packages/react-native-brownfield/ios/ReactNativeHostRuntime.swift @@ -120,6 +120,22 @@ final class ReactNativeHostRuntime { return true } + public func application( + _ app: UIApplication, + open url: URL, + options: [UIApplication.OpenURLOptionsKey: Any] = [:] + ) -> Bool { + return RCTLinkingManager.application(app, open: url, options: options) + } + + public func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + return RCTLinkingManager.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + /** * Starts React Native with optional callback when bundle is loaded. * From 6202bdd14c8c20d978e98221a7c7d548bb085e5f Mon Sep 17 00:00:00 2001 From: artus9033 Date: Sat, 14 Mar 2026 12:12:53 +0100 Subject: [PATCH 2/2] chore: add changeset --- .changeset/real-seas-bake.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/real-seas-bake.md diff --git a/.changeset/real-seas-bake.md b/.changeset/real-seas-bake.md new file mode 100644 index 00000000..446f677d --- /dev/null +++ b/.changeset/real-seas-bake.md @@ -0,0 +1,5 @@ +--- +'@callstack/react-native-brownfield': minor +--- + +feat: support linking in Expo and vanilla