【问题标题】:Xcode 12.5 and swift 5+ how to open external Urls links from a WKwebView?Xcode 12.5 和 swift 5+ 如何从 WKwebView 打开外部 Urls 链接?
【发布时间】:2021-11-03 16:16:35
【问题描述】:

我正在尝试使用本地 html 文件从 IOS 应用程序打开外部链接。我使用 Xcode 12.5 和 swift 5+。 我的 ViewController 中的代码很简单,只需打开文件夹 (www) 中的 index.html。 现在的问题是我需要在 iPhone 或 iPad 的 Safari 中打开外部链接 http 或 https,而不是在本地应用程序中。我该如何过滤?感谢您的想法。 到目前为止,这是我的代码 - 已更新:

import UIKit
import WebKit
import PDFKit

class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    
        
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        
        // let myURL = URL(string:"www/index.html")
        // let myRequest = URLRequest(url: myURL!)
        // webView.load(myRequest)
        
    
        let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "www")!
                
        webView.loadFileURL(url, allowingReadAccessTo: url)
        let request = URLRequest(url: url)
        webView.load(request)
        
    
        
        
    }
    
    // WKWebViewNavigationDelegate
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
             // Check for links.
             if navigationAction.navigationType == .linkActivated {
                 // Make sure the URL is set.
                 guard let url = navigationAction.request.url else {
                     decisionHandler(.allow)
                     return
                 }
     
                 // Check for the scheme component.
                 let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
                 if components?.scheme == "http" || components?.scheme == "https" {
     
                     if navigationAction.targetFrame == nil {
                         UIApplication.shared.open(url)
                         decisionHandler(.cancel)
                     } else {
                         decisionHandler(.allow)
                     }
     
                     // Open the link in the external browser.
                     UIApplication.shared.open(url)
                     // Cancel the decisionHandler because we managed the navigationAction.
                     decisionHandler(.cancel)
                 } else {
                     decisionHandler(.allow)
                 }
             
             }
        
    }

【问题讨论】:

  • 我正面临这段代码的崩溃。你也是这种情况吗?崩溃是因为decisionHandler闭包可能被执行2次,首先是.allow,然后是.cancel参数。如果不需要,请尝试完全删除 if navigationAction.targetFrame == nil/else 语句。
  • 不,它不会崩溃。但我会删除这部分。谢谢你的提示。
  • 好的,更新了,但还是有同样的问题,还是直接在WKWebView中打开外部链接,而不是在Safari浏览器中。

标签: ios swift webview


【解决方案1】:

显然您的 webView(_:decidePolicyFor:decisionHandler:) 委托函数永远不会被调用。通过添加断点或打印来检查它。

要解决这个问题,只需设置WKWebViewnavigationDelegate 并符合WKNavigationDelegate

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate { // <- conform to WKNavigationDelegate
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.navigationDelegate = self // <- set the navigationDelegate property
        webView.uiDelegate = self
        view = webView
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2021-12-27
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多