今天使用WKWebView遇到了一些问题,由于自己也是第一次使用这个控件,所以用来做个记录
加载URL:https://www.so.com显示正常,而加载https://m.500.com/info/article/detail-231721.shtml出现白屏
查看WKWebView的代理时,发现WKNavigationDelegate代理中有两个返回错误信息的代理,所以加入到代码中调试
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{
NSLog(@"加载失败%@", error.userInfo);
}
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error{
NSLog(@"加载失败%@", error.userInfo);
}
果真在didFailProvisionalNavigation返回了错误信息
NSErrorFailingURLKey = "https://m.500.com/info/article/detail-231721.shtml";
NSErrorFailingURLStringKey = "https://m.500.com/info/article/detail-231721.shtml";
NSLocalizedDescription = "An SSL error has occurred and a secure connection to the server cannot be made.";
NSLocalizedRecoverySuggestion = "Would you like to connect to the server anyway?";
NSUnderlyingError = "Error Domain=kCFErrorDomainCFNetwork Code=-1200 \"(null)\" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9858, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9858}";
"_NSURLErrorFailingURLSessionTaskErrorKey" = "LocalDataTask <2EF41F2F-E2B7-4179-A668-AA19CA4CE8C5>.<1>";
"_WKRecoveryAttempterErrorKey" = "<WKReloadFrameErrorRecoveryAttempter: 0x2805549a0>";
"_kCFStreamErrorCodeKey" = "-9858";
"_kCFStreamErrorDomainKey" = 3;
networkTaskDescription = "LocalDataTask <2EF41F2F-E2B7-4179-A668-AA19CA4CE8C5>.<1>";
WKWebview 抛出了SSL错误,无法与服务器建立安全链接
解决方法如下:
1.在info.plist中加入如下代码
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2.实现代理方法
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if([challengepreviousFailureCount] ==0) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}else{
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}else{
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}
重新运行后页面可以正确渲染了