NSURLConnection 实现webView显示HTTPS页面

最后更新于:2022-04-01 14:25:28

我们在浏览器访问https页面的时候的,会弹出: ![信任证书](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-07_570611039930e.jpg "") 我们接下来信任证书以及显示出来 遵循协议 ~~~ @interface ViewController ()<NSURLConnectionDataDelegate> ~~~ interface: ~~~ @interface ViewController ()<NSURLConnectionDataDelegate> /** - 存储data数据 */ @property(nonatomic,strong)NSMutableData *dataM; /** - 访问url链接 */ @property(nonatomic,strong)NSURL *url; @property(nonatomic,weak)IBOutlet UIWebView *webView; @end ~~~ viewDidLoad:创建url以及发送请求 ~~~ - (void)viewDidLoad { [super viewDidLoad]; self.url = [NSURL URLWithString:@"https://mail.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:self.url]; //发送请求 [NSURLConnection connectionWithRequest:request delegate:self]; } ~~~ 实现代理方法: ~~~ #pragma mark - NSURLSessionDataDelegate代理方法 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler { NSLog(@"challenge = %@",challenge.protectionSpace.serverTrust); //判断是否是信任服务器证书 if (challenge.protectionSpace.authenticationMethod ==NSURLAuthenticationMethodServerTrust) { //创建一个凭据对象 NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; //告诉服务器客户端信任证书 [challenge.sender useCredential:credential forAuthenticationChallenge:challenge]; } } /** * 接收到服务器返回的数据时调用 */ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"接收到的数据%zd",data.length); [self.dataM appendData:data]; } /** * 请求完毕 */ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *html = [[NSString alloc]initWithData:self.dataM encoding:NSUTF8StringEncoding]; NSLog(@"请求完毕"); [self.webView loadHTMLString:html baseURL:self.url]; } ~~~ 懒加载: ~~~ - (NSMutableData *)dataM { if (_dataM == nil) { _dataM = [[NSMutableData alloc]init]; } return _dataM; } ~~~ 至此,我们已经实现了https数据的展示: **注意:** NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9843) 原因:没有信任服务器证书 在下面这个方法中: ~~~ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler() ~~~ 我们通过protectionSpace.authenticationMethod判断是否信任服务器证书 - NSURLSessionAuthChallengeUseCredential = 0, 使用凭据 ,信任服务器证书 - NSURLSessionAuthChallengePerformDefaultHandling = 1, 默认处理,忽略服务器证书 - NSURLSessionAuthChallengeCancelAuthenticationChallenge = 2, 整个请求被取消 凭据被忽略 - NSURLSessionAuthChallengeRejectProtectionSpace = 3, 本次拒绝,下次重试
';