美文网首页
解决UIWebView无法访问https自签名网站报错问题

解决UIWebView无法访问https自签名网站报错问题

作者: AE86 | 来源:发表于2019-06-24 16:43 被阅读0次

    UIWebView在访问正常签名的https网站是没有问题的,只是在访问自签名https时发生错误,无法正常展示页面内容。主要原因是证书认证失败。这里我们可以通过网络请求转发的方式来绕过证书认证失败的问题。

    以下是具体的代码:

    增加几个属性保存

    @property (nonatomic, strong) NSURLRequest *originRequest;//原始网络请求

    @property (nonatomic, strong) NSURLConnection *urlConnection;//转换为urlConnection

    @property (nonatomic, assign) BOOL authenticated;//是否通过认证

    - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

{

    NSString*absoluteUrl = [[request URL] absoluteString];

    NSLog(@"网页地址为:%@",[request URL]);

    NSString*scheme = [[requestURL]scheme];

    if([scheme isEqualToString:@"https"]) {

        //如果是https:的话,那么就用NSURLConnection来重发请求。从而在请求的过程当中吧要请求的URL做信任处理。

        if (!_authenticated) {

            _authenticated=NO;

            self.originRequest =  request;

            _urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

            [_urlConnection start];

            returnNO;

        }

    }

    return YES;

}

然后在NURLConnection delegate中设置

- (void)connection:(NSURLConnection*)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge

{

    if([challenge previousFailureCount] ==0) {

        _authenticated = YES;

        //NSURLCredential 这个类是表示身份验证凭据不可变对象。凭证的实际类型声明的类的构造函数来确定。

        NSURLCredential *cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

        [challenge.sender useCredential:cre forAuthenticationChallenge:challenge];

    }

    else

    {

        [challenge.sender cancelAuthenticationChallenge:challenge];

    }

}

- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response;

{

    NSLog(@"WebController received response via NSURLConnection");

    // remake a webview call now that authentication has passed ok.

    _authenticated = YES;

    [self.webView loadRequest:self.originRequest];

    // Cancel the URL connection otherwise we double up (webview + url connection, same url = no good!)

    [_urlConnection cancel];

}

    在实际应用中,大家可以自定义一个UIWebView,方便后续增加新的功能,比如js交互等等

相关文章

网友评论

      本文标题:解决UIWebView无法访问https自签名网站报错问题

      本文链接:https://www.haomeiwen.com/subject/uluoqctx.html