didFailProvisionalLoadForFrame 对于某些 URL 但在 Safari 中工作正常

问题描述 投票:0回答:2

我遇到了一个奇怪的问题,即某个域无法在 WKWebView 中加载。它给出了一个错误:

WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, domain=NSURLErrorDomain, code=-1200

我认为这是在抱怨证书问题?如果我通过 info.plist 允许不安全的内容,它就可以正常工作,但我当然不想允许这样做。

该证书适合该域。不幸的是,我无法分享该网址。这是一个 .gov 域。该证书是 DigiCert 并且未过期。

它在应用程序之外的 Safari 中运行良好,甚至在 Firefox 和 Chrome 中也运行良好,我认为它们使用了 WKWebView,但也许不是?

有人遇到过这个问题吗?我可以采取哪些额外步骤来确定 WKWebView 到底在抱怨什么以及可以采取哪些措施来解决它?

我们实际上使用的是 Xamarin,但我们在 Xamarin 和 Xcode 中都有测试项目来复制该问题。

谢谢!

ios xcode xamarin xamarin.ios wkwebview
2个回答
6
投票

我发现问题了!

WKWebView(与 Safari 不同)要求 SSL 证书支持前向保密。

https://developer.apple.com/documentation/bundleresources/information_property_list/nsexceptionrequiresforwardsecrecy

您可以在此处检查证书是否支持此功能:

https://www.ssllabs.com/ssltest/analyze.html

可以在 info.plist 中禁用它,但我们选择要求网站所有者更改他们的证书。


0
投票

我在 SwiftUI 中使用 WKWebView 和 UIViewRepresentable 时遇到了这个问题。我的解决方法是在 WKWebViews 委托 didFailProvisionalNavigation 中重新加载页面。

struct CustomWebView: UIViewRepresentable{

    var webView = WKWebView()

   ...

   func makeCoordinator() -> Coordinator{
      Coordinator(self)
   }

    func makeUIView(context: Context) -> WKWebView  {
        webView.uiDelegate = context.coordinator
        webView.navigationDelegate = context.coordinator
        return webView
    }
   
    func reload(){
        webView.reload()
    }

   ...
}

class Coordinator: NSObject, WKUIDelegate, WKNavigationDelegate {

    var parent: CustomWebView

    init(_ parent: CustomWebView){
        self.parent = parent
    }
  
    ...

     func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        self.parent.reload()
    }
}
 
© www.soinside.com 2019 - 2024. All rights reserved.