iOS UIWebView 加載https 站點(diǎn)出現(xiàn)NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,

今天在加載https站點(diǎn)的時候遇到如下的錯誤問題。所以對自己之前寫的iOS內(nèi)嵌webview做了一些修改,可以讓它加載http站點(diǎn)也可以讓它加載https站點(diǎn)、


下面是我加載https站點(diǎn)的時候出現(xiàn)的錯誤。
error:
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)


HTTPS 超文本傳輸安全協(xié)議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文本傳輸協(xié)議SSL/TLS的組合,
HTTPS的主要思想是在不安全的網(wǎng)絡(luò)上創(chuàng)建一安全信道,并可在使用適當(dāng)?shù)募用馨?/em>服務(wù)器證書可被驗(yàn)證且可被信任時,對竊聽中間人攻擊提供合理的保護(hù)。**
HTTPS的信任繼承基于預(yù)先安裝在瀏覽器中的證書頒發(fā)機(jī)構(gòu)(如VeriSign、Microsoft等)(意即“我信任證書頒發(fā)機(jī)構(gòu)告訴我應(yīng)該信任的”)。因此,一個到某網(wǎng)站的HTTPS連接可被信任,如果服務(wù)器搭建自己的https 也就是說采用自認(rèn)證的方式來建立https信道,這樣一般在客戶端是不被信任的,所以我們一般在瀏覽器訪問一些https站點(diǎn)的時候會有一個提示,問你是否繼續(xù)。
使用webview加載https站點(diǎn)的時候,也會出現(xiàn)這樣的情況,也就是說我們必須在請求的時候?qū)⒃撜军c(diǎn)設(shè)置為安全的,才能繼續(xù)訪問

****
所以我們需要在webview開始加載網(wǎng)頁的時候首先判斷判斷該站點(diǎn)是不是https站點(diǎn),如果是的話,先然他暫停加載,先用
NSURLConnection 來訪問改站點(diǎn),然后再身份驗(yàn)證的時候,將該站點(diǎn)置為可信任站點(diǎn)。然后在用webview重新加載請求。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSString* scheme = [[requestURL]scheme];
NSLog(@"scheme = %@",scheme);
//判斷是不是https
if([schemeisEqualToString:@"https"])
{
if(self.authed)
{
returnYES;
}
NSURLConnection* conn = [[NSURLConnectionalloc]initWithRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:self.url]]delegate:self];
[connstart];
[webViewstopLoading];
returnNO;
}
returnYES;
}
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if([challenge previousFailureCount]==0)
{
_authed =YES;
//NSURLCredential這個類是表示身份驗(yàn)證憑據(jù)不可變對象。憑證的實(shí)際類型聲明的類的構(gòu)造函數(shù)來確定。
NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[challenge.sender useCredential:cre forAuthenticationChallenge:challenge];
}
}
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
returnrequest;
}
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
self.authed=YES;
//webview重新加載請求。
NSURL*url=[NSURLURLWithString:self.url];
NSURLRequest*request=[NSURLRequestrequestWithURL:url];
[webloadRequest:request];
[connectioncancel];
}

本文是復(fù)制的別的大神的 原文網(wǎng)址http://blog.csdn.net/folish_audi/article/details/38983893

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容