Skip to content

Commit f21197d

Browse files
thiagobrezokwasniewski
authored andcommitted
fix: deep and universal links when app is running
1 parent fef6d8e commit f21197d

File tree

6 files changed

+54
-2
lines changed

6 files changed

+54
-2
lines changed

packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,6 @@
2424
continueUserActivity:(nonnull NSUserActivity *)userActivity
2525
restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler;
2626

27+
+ (void)onOpenURL:(nonnull NSURL *)url NS_SWIFT_NAME(onOpenURL(url:));
28+
2729
@end

packages/react-native/Libraries/LinkingIOS/RCTLinkingManager.mm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#import "RCTLinkingPlugins.h"
1616

1717
static NSString *const kOpenURLNotification = @"RCTOpenURLNotification";
18+
static NSURL *initialURL = nil;
1819

1920
static void postNotificationWithURL(NSURL *URL, id sender)
2021
{
@@ -81,6 +82,16 @@ + (BOOL)application:(UIApplication *)application
8182
return YES;
8283
}
8384

85+
86+
+ (void)onOpenURL:(NSURL *)url
87+
{
88+
if (initialURL == nil) {
89+
initialURL = url;
90+
} else {
91+
postNotificationWithURL(url, self);
92+
}
93+
}
94+
8495
- (void)handleOpenURLNotification:(NSNotification *)notification
8596
{
8697
[self sendEventWithName:@"url" body:notification.userInfo];
@@ -153,6 +164,7 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
153164

154165
RCT_EXPORT_METHOD(getInitialURL : (RCTPromiseResolveBlock)resolve reject : (__unused RCTPromiseRejectBlock)reject)
155166
{
167+
#if !TARGET_OS_VISION
156168
NSURL *initialURL = nil;
157169
if (self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey]) {
158170
initialURL = self.bridge.launchOptions[UIApplicationLaunchOptionsURLKey];
@@ -163,6 +175,8 @@ - (void)handleOpenURLNotification:(NSNotification *)notification
163175
initialURL = ((NSUserActivity *)userActivityDictionary[@"UIApplicationLaunchOptionsUserActivityKey"]).webpageURL;
164176
}
165177
}
178+
#endif
179+
// React Native visionOS uses static property to retrieve initialURL.
166180
resolve(RCTNullIfNil(initialURL.absoluteString));
167181
}
168182

packages/react-native/Libraries/SwiftExtensions/RCTMainWindow.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import SwiftUI
2020
public struct RCTMainWindow: Scene {
2121
var moduleName: String
2222
var initialProps: RCTRootViewRepresentable.InitialPropsType
23+
var onOpenURLCallback: ((URL) -> ())?
2324

2425
public init(moduleName: String, initialProps: RCTRootViewRepresentable.InitialPropsType = nil) {
2526
self.moduleName = moduleName
@@ -30,10 +31,21 @@ public struct RCTMainWindow: Scene {
3031
WindowGroup {
3132
RCTRootViewRepresentable(moduleName: moduleName, initialProps: initialProps)
3233
.modifier(WindowHandlingModifier())
34+
.onOpenURL(perform: { url in
35+
onOpenURLCallback?(url)
36+
})
3337
}
3438
}
3539
}
3640

41+
extension RCTMainWindow {
42+
public func onOpenURL(perform action: @escaping (URL) -> ()) -> some Scene {
43+
var scene = self
44+
scene.onOpenURLCallback = action
45+
return scene
46+
}
47+
}
48+
3749
/**
3850
Handles data sharing between React Native and SwiftUI views.
3951
*/

packages/rn-tester/RNTester-visionOS/App.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ struct RNTesterApp: App {
1111

1212
var body: some Scene {
1313
RCTMainWindow(moduleName: "RNTesterApp")
14+
.onOpenURL(perform: { url in
15+
RCTLinkingManager.onOpenURL(url: url)
16+
})
1417

1518
RCTWindow(id: "SecondWindow", sceneData: reactContext.getSceneData(id: "SecondWindow"))
1619
.defaultSize(CGSize(width: 400, height: 700))

packages/rn-tester/RNTester-visionOS/Info.plist

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
33
<plist version="1.0">
44
<dict>
5+
<key>CFBundleURLTypes</key>
6+
<array>
7+
<dict>
8+
<key>CFBundleTypeRole</key>
9+
<string>Editor</string>
10+
<key>CFBundleURLName</key>
11+
<string>com.reactjs.ios</string>
12+
<key>CFBundleURLSchemes</key>
13+
<array>
14+
<string>rntester</string>
15+
</array>
16+
</dict>
17+
</array>
518
<key>UIApplicationSceneManifest</key>
619
<dict>
720
<key>UIApplicationPreferredDefaultSceneSessionRole</key>

packages/rn-tester/RNTesterPods.xcodeproj/project.pbxproj

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
763DC37C2B0F824400D2C0C5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
106106
763DC37F2B0F824400D2C0C5 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
107107
763DC3812B0F824400D2C0C5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
108+
76A65A522BC590CE0074A122 /* RNTester.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RNTester.entitlements; path = RNTester/RNTester.entitlements; sourceTree = "<group>"; };
108109
76E4BB272B34909800B02A15 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
109110
76E4BB2B2B34932200B02A15 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
110111
7CDA7A212644C6BB8C0D00D8 /* Pods-RNTesterIntegrationTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RNTesterIntegrationTests.release.xcconfig"; path = "Target Support Files/Pods-RNTesterIntegrationTests/Pods-RNTesterIntegrationTests.release.xcconfig"; sourceTree = "<group>"; };
@@ -230,6 +231,7 @@
230231
13B07FAE1A68108700A75B9A /* RNTester */ = {
231232
isa = PBXGroup;
232233
children = (
234+
76A65A522BC590CE0074A122 /* RNTester.entitlements */,
233235
F0D621C22BBB9E38005960AC /* PrivacyInfo.xcprivacy */,
234236
AC474BFB29BBD4A1002BDAED /* RNTester.xctestplan */,
235237
E771AEEA22B44E3100EA1189 /* Info.plist */,
@@ -963,6 +965,7 @@
963965
buildSettings = {
964966
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
965967
CLANG_ENABLE_MODULES = YES;
968+
CODE_SIGN_ENTITLEMENTS = RNTester/RNTester.entitlements;
966969
DEVELOPMENT_TEAM = "";
967970
HEADER_SEARCH_PATHS = (
968971
"${PODS_ROOT}/Headers/Private/Yoga",
@@ -1004,6 +1007,7 @@
10041007
buildSettings = {
10051008
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
10061009
CLANG_ENABLE_MODULES = YES;
1010+
CODE_SIGN_ENTITLEMENTS = RNTester/RNTester.entitlements;
10071011
DEVELOPMENT_TEAM = "";
10081012
EXCLUDED_ARCHS = "";
10091013
HEADER_SEARCH_PATHS = (
@@ -1050,9 +1054,11 @@
10501054
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
10511055
CLANG_ENABLE_OBJC_WEAK = YES;
10521056
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
1057+
CODE_SIGN_ENTITLEMENTS = "RNTester-visionOS/RNTester-visionOS.entitlements";
10531058
CURRENT_PROJECT_VERSION = 1;
10541059
DEBUG_INFORMATION_FORMAT = dwarf;
10551060
DEVELOPMENT_ASSET_PATHS = "\"RNTester-visionOS/Preview Content\"";
1061+
DEVELOPMENT_TEAM = Z3M9P6G4WY;
10561062
ENABLE_PREVIEWS = YES;
10571063
ENABLE_USER_SCRIPT_SANDBOXING = NO;
10581064
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -1123,7 +1129,7 @@
11231129
MARKETING_VERSION = 1.0;
11241130
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
11251131
MTL_FAST_MATH = YES;
1126-
PRODUCT_BUNDLE_IDENTIFIER = "com.meta.RNTester.localDevelopment.RNTester-visionOS";
1132+
PRODUCT_BUNDLE_IDENTIFIER = com.okwasniewski.rntester;
11271133
PRODUCT_NAME = "$(TARGET_NAME)";
11281134
SUPPORTED_PLATFORMS = "xros xrsimulator";
11291135
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
@@ -1148,10 +1154,12 @@
11481154
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
11491155
CLANG_ENABLE_OBJC_WEAK = YES;
11501156
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
1157+
CODE_SIGN_ENTITLEMENTS = "RNTester-visionOS/RNTester-visionOS.entitlements";
11511158
COPY_PHASE_STRIP = NO;
11521159
CURRENT_PROJECT_VERSION = 1;
11531160
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
11541161
DEVELOPMENT_ASSET_PATHS = "\"RNTester-visionOS/Preview Content\"";
1162+
DEVELOPMENT_TEAM = Z3M9P6G4WY;
11551163
ENABLE_PREVIEWS = YES;
11561164
ENABLE_USER_SCRIPT_SANDBOXING = NO;
11571165
GCC_C_LANGUAGE_STANDARD = gnu17;
@@ -1220,7 +1228,7 @@
12201228
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
12211229
MARKETING_VERSION = 1.0;
12221230
MTL_FAST_MATH = YES;
1223-
PRODUCT_BUNDLE_IDENTIFIER = "com.meta.RNTester.localDevelopment.RNTester-visionOS";
1231+
PRODUCT_BUNDLE_IDENTIFIER = com.okwasniewski.rntester;
12241232
PRODUCT_NAME = "$(TARGET_NAME)";
12251233
SUPPORTED_PLATFORMS = "xros xrsimulator";
12261234
SWIFT_COMPILATION_MODE = wholemodule;

0 commit comments

Comments
 (0)