升级React Native至0.72后Universal Links失效排查求助
React Native 0.72升级后Universal Links失效问题排查
问题背景
React Native应用在0.67版本时Universal Links功能正常,升级至0.72版本后该功能失效。已完成以下操作:
- 按照官方文档将
AppDelegate.m替换为AppDelegate.mm - 遵循Linking配置指南,添加Xcode头搜索路径中的
LinkingIOS文件夹 - 在新的
AppDelegate.mm中实现openURL和continueUserActivity方法 - 验证Web服务器上的AASA文件、关联域名授权文件配置正确(0.67版本分支测试正常)
现象
在iOS模拟器中点击Universal Links时,链接直接在浏览器打开,无法唤起应用(无论应用处于后台还是完全关闭状态);Xcode构建日志和Metro终端无报错,通过RCTLog()验证发现AppDelegate中的相关方法未被调用。
当前AppDelegate.mm代码
#import <Firebase.h> #import "AppDelegate.h" #import <React/RCTLinkingManager.h> #import <React/RCTBundleURLProvider.h> @implementation RNAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure]; // Following if statement is fix for https://quickbase.atlassian.net/browse/MB1-462 // Code is taken from this thread: https://github.com/mCodex/react-native-sensitive-info/issues/303 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HAS_RUN_BEFORE"] == NO) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HAS_RUN_BEFORE"]; NSArray *secItemClasses = [NSArray arrayWithObjects: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClassInternetPassword, (__bridge id)kSecClassCertificate, (__bridge id)kSecClassKey, (__bridge id)kSecClassIdentity, nil]; for (id secItemClass in secItemClasses) { NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass}; SecItemDelete((__bridge CFDictionaryRef)spec); } } self.moduleName = @"myAppName"; // You can add your custom initial props in the dictionary below. // They will be passed down to the ViewController used by React Native. self.initialProps = @{}; return [super application:application didFinishLaunchingWithOptions:launchOptions]; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } // iOS 9.x or newer - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [RCTLinkingManager application:application openURL:url options:options]; } - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { return [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } @end
可能遗漏的配置项
- 检查AppDelegate继承关系:确认
AppDelegate.h中RNAppDelegate是否继承自RCTAppDelegate,如果继承错误,系统代理方法无法被正确转发。 - 重新验证关联域名配置:打开Xcode项目的
Signing & Capabilities面板,确认Associated Domains中已添加applinks:yourdomain.com(域名需与AASA文件中一致,无多余空格)。 - 确认RCTLinking依赖:检查Podfile是否包含
React-RCTLinking,执行pod install重新安装依赖,确保链接库被正确引入。 - 重置模拟器缓存:删除模拟器上的应用,执行
Hardware -> Erase All Content and Settings重置模拟器,重启Xcode和Metro后重新安装应用。 - 检查方法签名准确性:对比官方
continueUserActivity方法签名,确保参数修饰符、拼写完全一致,避免因签名不匹配导致方法未被调用。
额外调试方法
- 监听系统通知:在
didFinishLaunchingWithOptions中添加以下代码,监听用户活动通知,排查是否能接收到Universal Links触发的事件:
并实现对应的处理方法:[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUserActivity:) name:UIApplicationUserActivityUpdatedNotification object:nil];- (void)handleUserActivity:(NSNotification *)notification { NSUserActivity *userActivity = notification.userInfo[UIApplicationUserActivityUpdatedNotificationUserActivityKey]; NSLog(@"Received user activity: %@", userActivity.activityType); } - 使用终端命令测试:执行
xcrun simctl openurl booted "你的Universal Links地址",观察是否能唤起应用,同时查看Xcode控制台输出。 - 检查编译配置:确认Build Settings中的
Other Linker Flags包含-ObjC,避免因链接器设置问题导致RCTLinkingManager方法无法调用。 - 真机测试:模拟器可能存在缓存问题,在真机上测试Universal Links功能,排除模拟器环境干扰。
- 查看AASA下载日志:打开Mac的
Console应用,搜索swcd,查看AASA文件的下载状态和报错信息,确认文件是否被成功获取。
内容的提问来源于stack exchange,提问作者Pankaj Badgujar
相关产品推荐
相关产品推荐

