React Native iOS端扫码唤起App/网页异常问题求助
React Native iOS DeepLink 无法唤起App问题排查与解决
问题核心分析
你当前的问题出在HTTPS链接的唤起逻辑上:iOS对于HTTPS这类通用Scheme的链接,默认会优先打开Safari,而非唤起你的App。你现在的配置混淆了普通URL Scheme和Universal Links的用法,导致iOS无法识别该链接属于你的App。
具体修正步骤
1. 修正Info.plist中的URL Types配置
你当前的URL Types配置使用了https作为Scheme,这是系统通用Scheme,无法触发App唤起。需要改为自定义Scheme,并修正CFBundleURLName:
<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLName</key> <string>com.yourcompany.yourapp</string> <!-- 替换为你的App Bundle ID --> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> <!-- 自定义Scheme,比如你的App简称 --> </array> </dict> </array>
注:这个自定义Scheme用于直接通过myapp://formulario.153cidadao.com.br/assedio?cidade=2这类链接唤起App,但你需要的是HTTPS链接唤起,所以还需要配置Universal Links。
2. 配置Universal Links(关键)
要让HTTPS链接唤起App,必须配置Universal Links:
- 开启Associated Domains权限:
登录Apple开发者后台,找到你的App ID,勾选Associated Domains权限,然后重新生成Provisioning Profile并安装到Xcode。 - 添加Associated Domains到Info.plist:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>formulario.153cidadao.com.br</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <false/> </dict> </dict> </dict> <key>Associated Domains</key> <array> <string>applinks:formulario.153cidadao.com.br</string> </array> - 部署apple-app-site-association文件到服务器:
在你的服务器根目录或.well-known目录下放置一个无后缀的apple-app-site-association文件,内容示例:
确保该文件能通过对应域名路径正常访问,且返回的Content-Type为{ "applinks": { "apps": [], "details": [ { "appID": "TEAMID.com.yourcompany.yourapp", <!-- 替换为你的Team ID + Bundle ID --> "paths": ["/assedio*"] <!-- 匹配需要唤起App的路径 --> } ] } }application/json。
3. 调整AppDelegate代码逻辑
将continueUserActivity的返回顺序调整,确保RCTLinkingManager优先处理:
// Universal Links - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; return result || [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; }
4. 测试注意事项
- 必须使用真机测试,模拟器对Universal Links的支持有限;
- 清除Safari缓存(设置 -> Safari -> 清除历史记录与网站数据),iOS会缓存关联文件,修改后需要清除缓存才能生效;
- 测试时不要直接在Safari地址栏输入链接,而是通过二维码、其他App跳转或短信链接打开,直接输入地址栏会强制打开网页。
内容的提问来源于stack exchange,提问作者Erikson
相关产品推荐
相关产品推荐

