WKWebView 加载 HTTPS 页面报错 -1202 的解决方法 (OC)
在使用 WKWebView 加载 HTTPS 页面时,报错 -1202 是因为该页面存在不受信任的证书或者证书配置有问题。
解决这个问题有两种方法:
-
忽略证书验证: 在 WKWebView 加载页面之前,可以通过配置 WKWebView 的 'customURLSchemeHandler' 属性来忽略证书验证。具体步骤如下:
// 创建一个 WKWebViewConfiguration 对象 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; // 创建一个自定义的 NSURLProtocol 对象 CustomURLProtocol *urlProtocol = [[CustomURLProtocol alloc] init]; // 将自定义的 NSURLProtocol 对象注册到 URL Loading System [NSURLProtocol registerClass:[urlProtocol class]]; // 创建一个自定义的 URLSchemeHandler 对象 CustomURLSchemeHandler *urlSchemeHandler = [[CustomURLSchemeHandler alloc] init]; // 将自定义的 URLSchemeHandler 对象设置为 config 的 customURLSchemeHandler 属性 config.customURLSchemeHandler = urlSchemeHandler; // 创建一个 WKWebView 对象,并使用 config 初始化 WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config]; // 加载 HTTPS 页面 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:'https://example.com']]; [webView loadRequest:request];在 CustomURLSchemeHandler 类中,需要实现 'webView:startURLSchemeTask:' 方法来处理自定义的 URL Scheme。在该方法中,可以忽略证书验证,例如:
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask { // 忽略证书验证 NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:urlSchemeTask.request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // 处理请求结果 // ... }]; [dataTask resume]; } // 实现 NSURLSessionDelegate 的代理方法,忽略证书验证 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; completionHandler(NSURLSessionAuthChallengeUseCredential, credential); } } -
配置信任的证书: 如果你有服务器的证书,可以将其导出为 pem 或 cer 格式,并在应用中进行配置。具体步骤如下:
- 将 pem 或 cer 证书文件添加到项目中。在添加文件时,需要勾选 'Copy items if needed' 选项。
- 在项目的 Info.plist 文件中,添加一个名为 'NSAppTransportSecurity' 的字典,并在该字典中添加一个名为 'NSExceptionDomains' 的字典。
- 在 'NSExceptionDomains' 字典中,添加一个以被访问的域名为 key 的字典,然后在该字典中添加一个名为 'NSIncludesSubdomains' 的布尔型值,设置为 YES。
- 在上一步的字典中,添加一个名为 'NSExceptionAllowsInsecureHTTPLoads' 的布尔型值,设置为 YES。
- 在上一步的字典中,添加一个名为 'NSExceptionMinimumTLSVersion' 的字符串类型值,设置为 'TLSv1.2'。
- 在上一步的字典中,添加一个名为 'NSThirdPartyExceptionMinimumTLSVersion' 的字符串类型值,设置为 'TLSv1.2'。
- 在上一步的字典中,添加一个名为 'NSExceptionRequiresForwardSecrecy' 的布尔型值,设置为 NO。
- 在上一步的字典中,添加一个名为 'NSExceptionRequiresForwardSecrecy' 的布尔型值,设置为 NO。
- 在上一步的字典中,添加一个名为 'NSExceptionAllowsInsecureHTTPLoads' 的布尔型值,设置为 YES。
- 在上一步的字典中,添加一个名为 'NSExceptionRequiresForwardSecrecy' 的布尔型值,设置为 NO。
- 在上一步的字典中,添加一个名为 'NSThirdPartyExceptionMinimumTLSVersion' 的字符串类型值,设置为 'TLSv1.2'。
- 在上一步的字典中,添加一个名为 'NSThirdPartyExceptionRequiresForwardSecrecy' 的布尔型值,设置为 NO。
- 在上一步的字典中,添加一个名为 'NSThirdPartyExceptionAllowsInsecureHTTPLoads' 的布尔型值,设置为 YES。
这样,WKWebView 加载 HTTPS 页面时就会信任该证书。
原文地址: https://www.cveoy.top/t/topic/pdNx 著作权归作者所有。请勿转载和采集!