iOS应用Universal Links是否必先经浏览器?如何实现在App内直接打开?
Cordova应用内直接打开关联域名链接的解决方案
问题根源
应用内点击关联域名链接时,WebView默认会把这类链接交给系统浏览器处理,哪怕你配好了Universal Links,也只会触发浏览器的“在App中打开”横幅,没法直接在应用内打开。
具体解决办法
1. 拦截WebView的链接跳转
你需要拦截所有指向关联域名的链接点击,阻止其跳转到Safari,转而在应用内处理。这里推荐用cordova-plugin-inappbrowser插件来实现:
先安装插件(如果没装的话),然后在deviceready事件里加拦截逻辑:
document.addEventListener('deviceready', () => { // 监听页面上所有点击事件 document.addEventListener('click', (e) => { let target = e.target; // 向上找到点击的a标签 while (target.tagName !== 'A' && target.parentNode) { target = target.parentNode; } if (target.tagName === 'A') { const url = target.href; // 判断是否是你的关联域名 if (url.includes('你的关联域名')) { e.preventDefault(); // 阻止默认跳转行为 // 在当前WebView内打开链接,隐藏地址栏 cordova.InAppBrowser.open(url, '_self', 'location=no'); // 要是需要触发deeplinks的路由逻辑,就调用插件的route方法 // IonicDeeplinks.route(url).then(match => { // // 根据匹配结果跳转到对应页面 // }); } } }, false); }, false);
2. 配置WebView允许关联域名在内部打开
如果不想用InAppBrowser,也可以直接修改Cordova的配置,让WebView允许关联域名在当前窗口打开。针对iOS,在config.xml里加这些配置:
<platform name="ios"> <!-- 指定允许的Universal Links域名 --> <preference name="AllowUniversalLinksFrom" value="你的关联域名" /> <!-- 让所有白名单内的URL都在WebView中打开 --> <preference name="OpenAllWhitelistedURLsInWebView" value="true" /> </platform>
3. 结合deeplinks插件处理应用内路由
如果你的链接需要跳转到应用内的特定页面,拦截后可以直接调用ionic-plugin-deeplinks的路由方法,让插件帮你处理页面跳转:
// 拦截到链接后调用 IonicDeeplinks.route(url) .then(match => { console.log('匹配到路由:', match); // 这里可以根据match结果跳转到对应的页面 }) .catch(err => { console.error('路由匹配失败:', err); });
注意点
- 确保你的
apple-app-site-association文件配置正确,应用的Bundle ID和签名信息要和文件里的一致。 - 测试的时候尽量用正式签名的包,模拟器有时候没法完整触发Universal Links的逻辑。
- 如果你用的是Ionic框架,可以结合框架自带的路由系统,让页面跳转更流畅。
内容的提问来源于stack exchange,提问作者connected_user
相关产品推荐
相关产品推荐

