无法使用 WKWebView 在 Safari 中打开外部链接

Posted

技术标签:

【中文标题】无法使用 WKWebView 在 Safari 中打开外部链接【英文标题】:Unable to open external link in safari using WKWebView 【发布时间】:2020-03-30 05:23:22 【问题描述】:

我正在从 UIWebView 迁移到 WKWebView。需要在WKWebView 中加载 html 内容,一切正常,但问题是在单击来自WKWebView 的任何链接后,无法在外部 safari 浏览器中打开链接。我用下面的代码

class CTFSPolicyAndTermsViewController: UIViewController, WKUIDelegate, WKNavigationDelegate 

出口和WKWebView变量

  @IBOutlet weak var webViewContainer: UIView!
  var webView: WKWebView!

viewDidLoad方法

    override func viewDidLoad() 
    super.viewDidLoad()
    webView = WKWebView()
    self.webView.uiDelegate = self
    self.webView.navigationDelegate = self

    let webConfiguration = WKWebViewConfiguration()
    webView =  WKWebView(frame: .zero, configuration: webConfiguration)
    webView.translatesAutoresizingMaskIntoConstraints = false
    webViewContainer.addSubview(webView)
   [webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor),
    webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor),
    webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor),
    webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor)].forEach   
     anchor in
    anchor.isActive = true
    

用于加载 HTML 内容

     if(self.isTermsMode)
        

            let path:String = Bundle.main.path(forResource: "abc", ofType: "html")!
            let text = try? String(contentsOfFile: path, encoding: String.Encoding.utf8)
            webView!.loadHTMLString(text!, baseURL: nil)
        

决定政策

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) 
        if let url = navigationAction.request.url 
            print(url)
            UIApplication.shared.open(url)  
            decisionHandler(.cancel)
         else 
        decisionHandler(.allow)
       
    

decidePolicyFor 方法应该调用但它没有执行我找不到问题

【问题讨论】:

你确定 HTML 没问题吗? decidePolicyFor 不能点击进入? 是的,我把断点放在了decisionPolicyFor 我的建议是尝试加载另一个页面(例如 google.com)来调试是委托方法还是 HTML 的问题。 你试过了吗? @Andrew 一切都很好,只是位置不对,现在工作正常...... 【参考方案1】:

我错过了订单

let webConfiguration = WKWebViewConfiguration()
    webView =  WKWebView(frame: .zero, configuration: webConfiguration)
    webView.translatesAutoresizingMaskIntoConstraints = false
    webViewContainer.addSubview(webView)
    [webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor),
     webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor),
     webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor),
     webView.rightAnchor.constraint(equalTo: 
      webViewContainer.rightAnchor)].forEach   anchor in
        anchor.isActive = true
    
    self.webView.uiDelegate = self
    self.webView.navigationDelegate = self

【讨论】:

以上是关于无法使用 WKWebView 在 Safari 中打开外部链接的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 safari 的网络检查器在 WKWebView 中调试用户 javascript

无法检查 WKWebView

WKWebView - 放大后内容不合适

如何调试iOS App中UIWebView和WKWebView使用的HTML文件

iOS13调试Safari和WKWebView中的页面

无法使用 WKWebView 通过 XMLHttpRequest 加载音频文件