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