React Native实现App间Deep Link:iOS测试失败问题求助
嘿,看到你Android端测试成功但iOS在Safari里打不开Deep Link的问题,我帮你梳理下最可能的几个遗漏点和解决步骤:
1. 先检查Info.plist的URL Scheme注册(最容易漏的一步)
iOS要求必须在Info.plist里注册你要用的URL Scheme,只改AppDelegate是不够的。你需要打开项目的Info.plist文件,添加如下配置:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>testlink</string> <!-- 这里填你的Scheme名称 --> </array> <key>CFBundleURLName</key> <string>com.yourcompany.yourapp</string> <!-- 建议填唯一的标识符,比如你的App Bundle ID --> </dict> </array>
如果你用的是Xcode的可视化界面编辑Info.plist,可以找到「URL Types」选项,点击+号添加,然后在「URL Schemes」里填入testlink,「Identifier」填你的Bundle ID。
2. 确认AppDelegate.m的代码实现是否完整
你提到已经在AppDelegate.m里加了#import,但要确保对应的Deep Link处理方法也正确实现了。完整的代码应该是这样的:
#import <React/RCTLinkingManager.h> // iOS 10及以上版本的处理方法 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [RCTLinkingManager application:app openURL:url options:options]; } // 兼容iOS 9及以下版本 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [RCTLinkingManager application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; }
如果你用的是iOS 13及以上版本,并且项目启用了SceneDelegate(React Native新版本默认会启用),还需要在SceneDelegate.m里添加对应的处理代码:
#import <React/RCTLinkingManager.h> - (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { if (URLContexts.count > 0) { NSURL *url = URLContexts.allObjects.firstObject.URL; [RCTLinkingManager application:[UIApplication sharedApplication] openURL:url options:@{}]; } }
3. 换一种测试方式(Safari直接输URL可能有坑)
有时候在Safari地址栏直接输入testlink://会被Safari拦截或者识别为无效地址,试试用下面两种方式测试:
- 创建一个简单的HTML文件,内容如下,然后用Safari打开这个文件,点击链接:
<a href="testlink://">点击打开我的App</a> - 在iPhone的备忘录里输入
testlink://,长按后选择「打开链接」。
4. 清理缓存并重启
Xcode的缓存有时候会导致配置不生效,建议:
- 按下
Command + Shift + K清理Build Folder - 重启模拟器/真机
- 重新编译运行你的App
5. 检查URL Scheme的唯一性
如果其他App也注册了testlink这个Scheme,会导致冲突,建议换成更独特的Scheme,比如com-yourcompany-yourapp(对应URL就是com-yourcompany-yourapp://),避免和其他App撞车。
按照上面的步骤一步步排查,应该就能解决Safari打不开Deep Link的问题了!
内容的提问来源于stack exchange,提问作者devedv

