iOS通用URL Scheme配置问题:NativeScript+Angular应用无法跳转
你踩了iOS处理通用链接的一个常见坑——HTTP/HTTPS 这类系统级 URL Scheme 不能通过普通的 CFBundleURLSchemes 配置来唤起应用,这和Android的Intent Filter逻辑完全不同。下面给你一步步梳理遗漏的配置和正确的实现方式:
1. 先纠正你当前 info.plist 的错误配置
你之前在 CFBundleURLSchemes 里填了 http://www.test.com,这是无效的。URL Scheme 只需要填协议前缀(比如自定义的 test),而完整的带host的HTTP链接属于**Universal Links(通用链接)**范畴,需要单独配置。先把这段错误的配置删掉,或者改成自定义scheme留作备用。
2. 配置 iOS Universal Links(通用链接)
这是iOS实现HTTP/HTTPS链接直接唤起已安装应用的标准方式,步骤如下:
步骤1:开启开发者账号的 Associated Domains 功能
- 登录 Apple Developer 后台,找到你的 App ID,勾选 Associated Domains 选项,然后重新生成并下载配置文件,导入到你的NativeScript项目中。
步骤2:在 info.plist 中添加 Associated Domains
添加以下配置,替换成你的域名:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <!-- 如果你需要更严格的ATS配置,也可以单独允许你的域名 --> </dict> <key>AssociatedDomains</key> <array> <string>applinks:www.test.com</string> </array>
注意:
applinks:是固定前缀,后面跟你的域名,不要加http/https。
步骤3:在服务器上部署 apple-app-site-association 文件
在你的域名 www.test.com 的根目录或者 .well-known 目录下放置一个名为 apple-app-site-association 的文件(无后缀),内容格式如下:
{ "applinks": { "apps": [], "details": [ { "appID": "你的TeamID.你的BundleID", "paths": ["*", "/app/*"] // 这里配置允许唤起应用的路径,*表示所有路径 } ] } }
TeamID可以在Apple Developer后台的账号信息里找到;BundleID是你App的唯一标识,要和info.plist里的CFBundleIdentifier一致;- 这个文件必须通过HTTPS访问(苹果要求),且不能有任何重定向。
步骤4:在NativeScript中处理通用链接跳转
你需要监听应用通过Universal Links打开的事件,把链接路径映射到Angular路由:
- 安装
nativescript-urlhandler插件:npm install nativescript-urlhandler --save - 在
app.module.ts中初始化插件,并监听跳转事件:import { UrlHandler } from 'nativescript-urlhandler'; // 在NgModule的初始化代码里添加 UrlHandler.init(); // 监听链接打开事件 UrlHandler.addListener((url) => { // 解析url的路径部分,比如http://www.test.com/home 解析出/home const path = url.replace('http://www.test.com', ''); // 跳转到对应的Angular路由 this.router.navigate([path]); });
3. 为什么自定义Scheme能生效?
自定义的 test:// 这类Scheme属于应用私有的协议,iOS允许通过 CFBundleURLSchemes 注册,所以分享后能直接唤起应用。但HTTP/HTTPS是系统级协议,默认会交给Safari处理,必须通过Universal Links把你的域名和应用绑定,才能让系统知道这个域名的链接应该打开你的应用。
测试注意事项
- 测试时必须用真实的iOS设备(模拟器对Universal Links支持有限);
- 确保你的应用已经通过Ad Hoc或者App Store安装到设备上;
- 可以用苹果的官方验证工具检查你的配置是否正确。
内容的提问来源于stack exchange,提问作者panagulis72

