我遇到了一个奇怪的问题,即某个域无法在 WKWebView 中加载。它给出了一个错误:
WebPageProxy::didFailProvisionalLoadForFrame: frameID=3, domain=NSURLErrorDomain, code=-1200
我认为这是在抱怨证书问题?如果我通过 info.plist 允许不安全的内容,它就可以正常工作,但我当然不想允许这样做。
该证书适合该域。不幸的是,我无法分享该网址。这是一个 .gov 域。该证书是 DigiCert 并且未过期。
它在应用程序之外的 Safari 中运行良好,甚至在 Firefox 和 Chrome 中也运行良好,我认为它们使用了 WKWebView,但也许不是?
有人遇到过这个问题吗?我可以采取哪些额外步骤来确定 WKWebView 到底在抱怨什么以及可以采取哪些措施来解决它?
我们实际上使用的是 Xamarin,但我们在 Xamarin 和 Xcode 中都有测试项目来复制该问题。
谢谢!
我发现问题了!
WKWebView(与 Safari 不同)要求 SSL 证书支持前向保密。
您可以在此处检查证书是否支持此功能:
https://www.ssllabs.com/ssltest/analyze.html
可以在 info.plist 中禁用它,但我们选择要求网站所有者更改他们的证书。
我在 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()
}
}