在使用 WKWebView 加载 HTTPS 页面时,报错 -1202 是因为该页面存在不受信任的证书或者证书配置有问题。

解决这个问题有两种方法:

  1. 忽略证书验证: 在 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);
        }
    }
    
  2. 配置信任的证书: 如果你有服务器的证书,可以将其导出为 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 页面时就会信任该证书。

WKWebView 加载 HTTPS 页面报错 -1202 的解决方法 (OC)

原文地址: https://www.cveoy.top/t/topic/pdNx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录