React Native 0.68.3 iOS通用链接无法读取UIApplicationLaunchOptionsURLKey
解决iOS 17通用链接启动时launchOptions参数为空的问题
问题原因
iOS 13及以上版本中,通过通用链接启动App时,系统不再将链接URL和来源应用信息放入didFinishLaunchingWithOptions的launchOptions字典中,而是通过NSUserActivity的回调传递这些数据,所以你在原方法中读取UIApplicationLaunchOptionsURLKey和UIApplicationLaunchOptionsSourceApplicationKey会返回null。
解决方案
在AppDelegate.mm中实现application:continueUserActivity:restorationHandler:方法,从NSUserActivity对象中获取所需数据:
修改后的AppDelegate.mm代码
@implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 保留原有初始化代码 NSString *sourceApplication = launchOptions[UIApplicationLaunchOptionsSourceApplicationKey]; NSString *sourceURL = launchOptions[UIApplicationLaunchOptionsURLKey]; if (sourceApplication) { NSLog(@"SHERIF_TEST UIApplicationLaunchOptionsSourceApplicationKey: %@", sourceApplication); } else { NSLog(@"SHERIF_TEST No UIApplicationLaunchOptionsSourceApplicationKey found in launchOptions"); } if (sourceURL) { NSLog(@"SHERIF_TEST UIApplicationLaunchOptionsURLKey: %@", sourceURL); } else { NSLog(@"SHERIF_TEST No UIApplicationLaunchOptionsURLKey found in launchOptions"); } // 其他初始化代码... return YES; } // 新增通用链接处理回调 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { // 验证是否为通用链接类型 if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) { NSURL *url = userActivity.webpageURL; NSString *sourceBundleId = userActivity.openInApplicationBundleIdentifier; // iOS13+替代sourceApplication的属性 if (url) { NSLog(@"SHERIF_TEST Universal Link URL: %@", url); // 将URL传递给Segment SDK做事件追踪 // 示例:[[SEGAnalytics sharedAnalytics] track:@"Universal Link Opened" properties:@{@"url": url.absoluteString}]; } if (sourceBundleId) { NSLog(@"SHERIF_TEST Source Application Bundle ID: %@", sourceBundleId); // 传递来源应用信息给Segment // 示例:[[SEGAnalytics sharedAnalytics] track:@"Universal Link Opened" properties:@{@"source_bundle_id": sourceBundleId}]; } } // 确保React Native侧链接跳转逻辑正常 return [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } @end
补充说明
- 冷/热启动兼容:无论App是冷启动还是后台唤醒,通用链接触发都会走
continueUserActivity方法,确保稳定获取链接数据。 - 来源标识替代:
UIApplicationLaunchOptionsSourceApplicationKey在iOS 13后已废弃,改用userActivity.openInApplicationBundleIdentifier获取来源应用的Bundle ID。 - RN链接兼容:调用
RCTLinkingManager的对应方法,保证React Native侧的页面跳转逻辑不受影响。
内容的提问来源于stack exchange,提问作者Sherif.Mohamed
相关产品推荐
相关产品推荐

