You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS跨子域名场景下Universal Links无法触发的问题求助

解决方案:同顶级域名子域名Universal Links在WebView不触发的问题

针对你遇到的同顶级域名下不同子域名Universal Links在WebView中无法触发跳转App 2的问题,以下是几个无需更换顶级域名的可行方案:

1. 手动在WKWebView导航代理中拦截处理

iOS对WebView内同顶级域名的子域名链接,默认不会触发系统级的Universal Links跳转逻辑,需要手动拦截并触发跳转:

  • 给WKWebView设置WKNavigationDelegate,实现webView(_:decidePolicyFor:decisionHandler:)方法:
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        guard let url = navigationAction.request.url else {
            decisionHandler(.allow)
            return
        }
        
        // 检测是否是目标Universal Links
        if url.host == "breakout.domain.com" && url.path.hasPrefix("/go") {
            // 触发App跳转
            UIApplication.shared.open(url, options: [.universalLinksOnly: true]) { success in
                if success {
                    decisionHandler(.cancel) // 取消WebView加载
                } else {
                    decisionHandler(.allow) // 跳转失败则用浏览器打开
                }
            }
            return
        }
        
        decisionHandler(.allow)
    }
    
  • 这里使用.universalLinksOnly选项,确保只有当该链接是有效的Universal Links时才打开App,否则 fallback 到浏览器。

2. 检查apple-app-site-association文件的路径规则

确保你的apple-app-site-association文件中,paths配置足够宽松以匹配带查询参数的链接:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "你的TeamID.App2的BundleID",
        "paths": [ "/go*" ] // 用通配符匹配所有/go开头的路径,包括带查询参数的情况
      }
    ]
  }
}

如果之前的路径规则是"/go"而不带通配符,带?foo=bar的链接可能无法匹配上,导致系统不识别为Universal Links。

3. 验证WebView的配置项

  • 检查是否开启了WKWebViewConfiguration的allowsLinkPreview,该属性可能影响链接的跳转行为,若开启可尝试关闭后测试。
  • 确认App 1的Info.plist中没有设置限制WebView跳转的配置,比如NSAllowsArbitraryLoads相关的设置是否影响了链接的处理(不过你当前能打开浏览器,此问题概率较低)。

如果上述方法仍不生效,可以尝试通过NSUserActivity来触发系统的Universal Links识别逻辑:

func openUniversalLink(_ url: URL) {
    let userActivity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
    userActivity.webpageURL = url
    UIApplication.shared.continue(userActivity) { success in
        if !success {
            UIApplication.shared.open(url)
        }
    }
}

在WebView的导航代理中调用这个方法,替代直接open(_:options:),可以强制让系统处理Universal Links。

内容的提问来源于stack exchange,提问作者Ben Leffler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:40:59