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

Swift中为WKWebView添加排除特定域名跳转Safari的条件

解决方案

以下是符合需求的Swift实现代码,逻辑和你Android端的写法对齐:

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    guard let url = navigationAction.request.url else {
        decisionHandler(.allow)
        return
    }
    
    // 处理tel、mailto协议,跳转系统对应应用
    if ["mailto", "tel"].contains(url.scheme) {
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }
    // 非vivibusso.app域名的链接,跳转至Safari
    else if let host = url.host, !host.contains("vivibusso.app") {
        if UIApplication.shared.canOpenURL(url) {
            UIApplication.shared.open(url)
            decisionHandler(.cancel)
        } else {
            decisionHandler(.allow)
        }
    }
    // vivibusso.app域名的链接,留在WKWebView内加载
    else {
        decisionHandler(.allow)
    }
}

代码逻辑说明

  • 非空判断:先对navigationAction.request.url做非空校验,避免可选值处理错误;
  • 协议跳转处理:保留你原有逻辑,tel、mailto协议直接跳转系统对应应用,同时取消WebView内部导航;
  • 域名判断逻辑:通过url.host获取链接的域名,判断是否不包含vivibusso.app——如果是这类链接,就调用系统浏览器打开,取消WebView导航;
  • 目标域名处理:属于vivibusso.app的链接,允许在WKWebView内部加载。

和Android写法的对应关系

你的Android代码通过!url.contains("vivibusso.app")判断非目标域名,iOS端通过!host.contains("vivibusso.app")实现完全一致的逻辑,只是iOS需要先从URL中解析出host(域名部分)再做判断,比Android的字符串匹配更精准,避免误判URL路径中包含该字符串的情况。

如果需要精确匹配根域名(比如只匹配vivibusso.app,不包含sub.vivibusso.app),可以把判断条件改成:

host == "vivibusso.app"

如果需要匹配所有子域名(比如sub.vivibusso.app也留在WebView),可以用:

host.hasSuffix(".vivibusso.app") || host == "vivibusso.app"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:23:16