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
相关产品推荐
相关产品推荐

