WKWebView加载https网页时显示白屏

今天使用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);

    }

}


重新运行后页面可以正确渲染了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容