iOS UIWebView 로 딩 https 사이트 에 NSURLConnection/CFURLConnection HTTP load failed

오늘 https 사 이 트 를 불 러 올 때 다음 과 같은 오류 가 발생 했 습 니 다.그래서 자신 이 이전에 쓴 iOS 에 웹 뷰 를 삽입 하여 http 사이트 도 불 러 올 수 있 고 https 사이트 도 불 러 올 수 있 습 니 다.
다음은 제 가 https 사 이 트 를 불 러 올 때 발생 한 오류 입 니 다.
error: 

   NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

HTTPS 하이퍼텍스트 전송 보안 프로 토 콜(줄 임 말:HTTPS,영어:Hypertext Transfer Protocol Secure)은 하이퍼텍스트 전송 프로 토 콜 과 SSL/TLS 의 조합 입 니 다.
HTTPS 의 주요 사상 은 안전 하지 않 은 네트워크 에 보안 채널 을 만 들 고 적당 한 암호 화 패키지 와 서버 인증 서 를 사용 하면 검증 되 고 신뢰 할 수 있 을 때 도청 과 브로커 공격 에 합 리 적 인 보 호 를 제공 하 는 것 이다.
HTTPS 의 신뢰 계승 은 브 라 우 저 에 미리 설 치 된 인증서 발급 기관(예 를 들 어 VeriSign,Microsoft 등)을 기반 으로 합 니 다.따라서 특정한 사이트 에 가 는 HTTPS 연결 은 신뢰 를 받 을 수 있 습 니 다.만약 에 서버 가 자신의 https 를 구축 하면 자체 인증 방식 으로 https 채널 을 만 드 는 것 입 니 다.그러면 클 라 이언 트 에서 신뢰 를 받 지 못 하기 때문에 저 희 는 보통 브 라 우 저 에서 https 사이트 에 방문 할 때 계속 하 느 냐 는 힌트 가 있 습 니 다.
웹 뷰 를 사용 하여 https 사 이 트 를 불 러 올 때 도 이러한 상황 이 발생 합 니 다.즉,요청 할 때 이 사 이 트 를 안전 하 게 설정 해 야 계속 방문 할 수 있 습 니 다.
그래서 우 리 는 웹 뷰 에서 웹 페이지 를 불 러 오기 시작 할 때 먼저 이 사이트 가 https 사이트 인지 아 닌 지 를 판단 해 야 합 니 다.만약 그렇다면 먼저 그 가 불 러 오 는 것 을 중단 하고 먼저 사용 해 야 합 니 다.
NSURLConnection 은 변 경 된 사이트 에 방문 한 다음 인증 할 때 이 사 이 트 를 신뢰 할 수 있 는 사이트 로 설정 합 니 다.그리고 웹 뷰 로 요청 을 다시 불 러 옵 니 다.
#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView *)awebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString* scheme = [[request URL] scheme];
    NSLog(@"scheme = %@",scheme);
    //     https
    if ([scheme isEqualToString:HTTPS]) {
         //   https:  ,    NSURLConnection     。               URL     。
        if (!self.isAuthed) {
            originRequest = request;
            NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
            [conn start];
            [awebView stopLoading];
            return NO;
        }
    }
    NSURL *theUrl = [request URL];
    self.currenURL = theUrl;
    return YES;
}

NSURLConnection 에이전트 에서 신뢰 문 제 를 처리 합 니 다.
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{

    if ([challenge previousFailureCount]== 0) {
        _authed = YES;

        //NSURLCredential                  。                   。
        NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:cre forAuthenticationChallenge:challenge];
    }
}

마지막 으로 NSURLConnection 에이전트 에서 응답 을 받 은 후 웹 뷰 를 사용 하여 https 사 이 트 를 다시 불 러 옵 니 다.
#pragma mark ================= NSURLConnectionDataDelegate 
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{

    NSLog(@"%@",request);
    return request;
    
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

    self.authed = YES;
    //webview       。
    [webView loadRequest:originRequest];
    [connection cancel];
}

좋은 웹페이지 즐겨찾기