【发布时间】:2018-04-18 14:43:17
【问题描述】:
我的应用程序中有一个 WKWebView,点击它时 WKWebView 中有一些按钮,没有加载新页面。从表面上看,他们正试图打开一个 about_blank 页面。在浏览器中,链接在新页面中打开并加载 URL。
【问题讨论】:
我的应用程序中有一个 WKWebView,点击它时 WKWebView 中有一些按钮,没有加载新页面。从表面上看,他们正试图打开一个 about_blank 页面。在浏览器中,链接在新页面中打开并加载 URL。
【问题讨论】:
执行此操作的方法是实现WKUIDelegate 并覆盖此方法
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?
如果您使用传递的配置返回一个新的WKWebView,请求将被加载到一个新的webview。由于target=_blank 尝试在浏览器中打开一个新窗口,因此此方法在 iOS 中进行了补偿。您可以使用这个新的WKWebView 启动一个新的UIViewController,其中请求target=_blank 页面。
这是一个简单的例子,我用新的 webView 替换主 WKWebView,并在同一个视图控制器中加载请求,
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
}
}
这在某种程度上就像浏览器中的标签一样。但是,请记住,通过上述更改,前进和后退不起作用,因为您已经创建了一个新的 web 视图。如果你希望一切正常,我建议你用这个 webview 加载一个新的 viewcontroller 或者创建一个新的 view 来加载和显示它,你可以切换到其他主 webview。
【讨论】:
我采用了这种方法,即使这种方法在设备 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)
}
【讨论】:
快速解决方案
public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
if navigationAction.targetFrame == nil {
self.webView.load(navigationAction.request)
}
return nil
}
你需要委托 WKUIDelegate
【讨论】: