WKWebView target =“_ blank”链接在safari ios11,swift 4中打开新选项卡

时间:2018-01-03 08:35:58

标签: safari ios11 swift4 wkwebview

我理解这个问题已经被问了很多,我想我已经看过每一篇关于这个问题的帖子,但我仍然无法让它发挥作用。我是swift的新手,我认为这会阻止我从其他答案中调整代码片段。

所以这是我的问题:

我正在使用WKWebView查看我的应用中的网站。当我点击打开新标签的链接时,没有任何反应。我希望在Safari中打开新标签,或者至少在新的wkwebview中打开。我尝试过这样的答案:https://stackoverflow.com/a/27391215Open a WKWebview target="_blank" link in Safari以及许多其他类似的答案,但我没有取得任何进展。我需要做什么才能在swift 4中使用它?

目前我只是拥有这个,因为我无法实现我成功找到的任何其他解决方案:

func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    if navigationAction.targetFrame == nil {
        webView.load(navigationAction.request)
    }
    return nil
}

但它似乎没有做任何事情。如果有人可以帮我指出正确的方向,我会非常感激。

2 个答案:

答案 0 :(得分:8)

我已粘贴了一些 WKWebView 项目的示例代码(从文件夹加载本地html),该项目需要在新浏览器窗口中打开const的链接。

我已经强调了让正确打开链接所必须具备的3件事。

  1. target=_blank
  2. class ViewController extends WKUIDelegate
  3. 使用self.webView.uiDelegate = self代替UIApplication.shared.open
  4. 让我知道它有效,如果有人可以建议改进下面的示例代码,那对我也有帮助:))

    以下 Xcode 9.2,Swift 4 的完整示例代码。

    祝你好运

    webView.load

答案 1 :(得分:0)

详细信息

  • Xcode 10.2(10E125),Swift 5

解决方案

extension ViewController: WKUIDelegate {

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        // push new screen to the navigation controller when need to open url in another "tab"
        if let url = navigationAction.request.url, navigationAction.targetFrame == nil {
            let viewController = ViewController()
            DispatchQueue.main.async { [weak self] in
                self?.navigationController?.pushViewController(viewController, animated: true)
            }
            // .....
            return viewController.webView
        }
        return nil
    }

完整样本

Info.plist

添加您的Info.plist传输安全设置

 <key>NSAppTransportSecurity</key>
 <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
 </dict>

代码

import UIKit
import WebKit

class ViewController: UIViewController {

    private lazy var url = URL(string: "https://google.com")!
    private weak var webView: WKWebView?

    func initWebView(configuration: WKWebViewConfiguration) {
        if webView != nil { return }
        let webView = WKWebView(frame: UIScreen.main.bounds, configuration: configuration)
        webView.uiDelegate = self
        view.addSubview(webView)
        self.webView = webView
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if webView == nil { initWebView(configuration: WKWebViewConfiguration()) }
        webView?.load(url: url)
    }
}

extension ViewController: WKUIDelegate {

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        // push new screen to the navigation controller when need to open url in another "tab"
        if let url = navigationAction.request.url, navigationAction.targetFrame == nil {
            let viewController = ViewController()
            viewController.initWebView(configuration: configuration)
            viewController.url = url
            DispatchQueue.main.async { [weak self] in
                self?.navigationController?.pushViewController(viewController, animated: true)
            }
            return viewController.webView
        }
        return nil
    }
}

extension WKWebView {
    func load(url: URL) { load(URLRequest(url: url)) }
}

enter image description here