You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

补充说明

  1. 冷/热启动兼容:无论App是冷启动还是后台唤醒,通用链接触发都会走continueUserActivity方法,确保稳定获取链接数据。
  2. 来源标识替代:UIApplicationLaunchOptionsSourceApplicationKey在iOS 13后已废弃,改用userActivity.openInApplicationBundleIdentifier获取来源应用的Bundle ID。
  3. RN链接兼容:调用RCTLinkingManager的对应方法,保证React Native侧的页面跳转逻辑不受影响。

内容的提问来源于stack exchange,提问作者Sherif.Mohamed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:07:39