WKWebView target="_blank" 链接在 safari ios11,swift 4 中打开新标签

Posted

技术标签:

【中文标题】WKWebView target="_blank" 链接在 safari ios11,swift 4 中打开新标签【英文标题】:WKWebView target="_blank" link open new tab in safari ios11, swift 4 【发布时间】:2018-01-03 08:35:58 【问题描述】:

我知道这个问题被问了很多,我想我已经查看了每一篇关于这个的帖子,但我仍然无法让它发挥作用。我是 swift 新手,我认为这阻碍了我从其他答案中调整代码 sn-ps。

这是我的问题:

我正在使用 WKWebView 在我的应用中查看网站。当我单击打开新选项卡的链接时,没有任何反应。我希望该新选项卡在 safari 或至少在新的 wkwebview 中打开。我已经尝试从:https://***.com/a/27391215、Open 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

但它似乎没有做任何事情。如果有人能帮助我指出正确的方向,我将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

    class ViewController extends WKUIDelegate self.webView.uiDelegate = self 使用UIApplication.shared.open 代替webView.load

让我知道它有效,如果有人可以建议对下面的示例代码进行改进,那也会对我有所帮助:)

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

祝你好运

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate 

    @IBOutlet weak var webView: WKWebView!
    override func viewDidLoad() 
        super.viewDidLoad()
        self.webView.uiDelegate = self

        let htmlPath = Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")
        let htmlUrl = URL(fileURLWithPath: htmlPath!)
        let htmlDir = Bundle.main.url(forResource: "www", withExtension: nil)
        webView.loadFileURL(htmlUrl, allowingReadAccessTo: htmlDir!)
    

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? 
        if navigationAction.targetFrame == nil 
            //webView.load(navigationAction.request)
            UIApplication.shared.open(navigationAction.request.url!, options: [:])
        
        return nil
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    

    override var prefersStatusBarHidden: Bool 
        return true
    


【讨论】:

谢谢你!我的 webview 没有处理 URL 事件,我不知道使用哪个委托方法来处理它。【参考方案2】:

详情

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)) 

【讨论】:

以上是关于WKWebView target="_blank" 链接在 safari ios11,swift 4 中打开新标签的主要内容,如果未能解决你的问题,请参考以下文章

WKWebView target="_blank" 链接在 safari ios11,swift 4 中打开新标签

iOS- "_OBJC_CLASS_$_WKWebView", referenced from: 解决记录

iOS14,WKWebView 无法打开带有 _blank 目标的链接

WKWebview 在 macOS 上的默认浏览器中打开目标 =“_blank”链接

Swift WKWebview---解决的常见问题

我可以在 Markdown 中创建带有 'target="_blank"' 的链接吗?