在本机 iOS 中未加载在新窗口或选项卡中打开的链接

BXV*_*BXV 2 ios swift wkwebview

我的应用程序中有一个 WKWebView,单击它时 WKWebView 中有一些按钮,未加载新页面。从表面上看,他们正试图打开一个 about_blank 页面。在浏览器中,链接在新页面中打开并加载 URL。

BXV*_*BXV 6

我采用了这种方法,即使这种方法在设备 safari 浏览器中打开 URL,无论如何这些链接都指向外部链接,这种方法有帮助

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.targetFrame == nil {
    if let url = navigationAction.request.url {
        let app = UIApplication.shared
        if app.canOpenURL(url) {
            app.open(url, options: [:], completionHandler: nil)
        }
    }
}
decisionHandler(.allow)
}
Run Code Online (Sandbox Code Playgroud)


San*_*eep 5

你这样做的方法是实现WKUIDelegate和覆盖这个方法

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?
Run Code Online (Sandbox Code Playgroud)

如果您WKWebView使用传递的配置返回一个新的,请求将被加载到一个新的 webview。由于target=_blank尝试在浏览器中打开一个新窗口,此方法弥补了 iOS 中的不足。你可以UIViewController用这个新WKWebViewtarget=_blank页面请求来启动一个新的。

这是一个简单的例子,我WKWebView用新的 webView替换 main ,并在同一个视图控制器中加载请求,

extension ViewController: WKNavigationDelegate, WKUIDelegate {

    public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        let newWebView = WKWebView(frame: self.webView.frame,
                         configuration: configuration)
        view.addSubview(newWebView)
        return newWebView
    }
}
Run Code Online (Sandbox Code Playgroud)

这在某种程度上就像浏览器中的选项卡。但是,请记住,通过上述更改,向前和向后不起作用,因为您已经创建了一个新的 web 视图。如果你想让一切正常,我建议你用这个 webview 加载一个新的 viewcontroller 或者创建一个新的视图来加载和显示它,你可以切换到其他主 webview。