標籤:des code http c strong com
iOS 終端請求服務端資料時,為了保證資料安全,我們一般會使用https協議加密,而對於iOS的網路編程,我們一般會使用開源架構:ASIHTTPRequest,但是如果使用傳統的http方式,即使忽略驗證的話,程式也會報[error-9844]的錯誤,具體錯誤如下描述:
【Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0x6aafa30 {NSUnderlyingError=0x6a3fd90 "The operation couldn’t be completed. (OSStatus error -9844.)", NSLocalizedDescription=A connection failure occurred}】
那麼該如何解決該問題呢?經過尋找解決方案如下:
解決方案1
1) [request setValidatesSecureCertificate:NO];
2) 在ASIHTTPRequest.m檔案中尋找”https”,向sslProperties字典中增加kCFStreamSSLLevel對象,網上的參考方法:
[sslProperties setObject:(NSString *)(CFStringRef*)kCFStreamSocketSecurityLevelSSLv3 forKey:(NSString*)kCFStreamSSLLevel];
但是,sslProperties字典並非可變字典,所以你需要將sslProperties修改為可變字典NSMutableDictionary。
解決方案2
如果需要更加靈活的對SSL security level進行設定,可以將CFStringRef*sslSecurityLevel作為變數提到ASIHTTPRequest.h檔案的property中,具體操作如下:
1) 在ASIHTTPRequest.h的檔案中添加聲明:
CFStringRef *sslSecurityLevel;
2) 在ASIHTTPRequest.h的檔案中添加CFStringRef屬性:
@property (assign) CFStringRef *sslSecurityLevel;
3) 在ASIHTTPRequest.m的檔案中添加CFStringRef屬性:
@synthesize sslSecurityLevel;
4) 在ASIHTTPRequest.m的檔案修改:
NSDictionary *sslProperties = [[NSDictionary alloc]initWithObjectsAndKeys:??,將不可變字典更改為可變字典(NSMutableDictionary),即:
NSMutableDictionary *sslProperties = [[NSMutableDictionary alloc]initWithObjectsAndKeys:??
5) 在4)修改語句結束的地方添加設定SSL security level的代碼:
// Use requested SSL security level
if ([self sslSecurityLevel] != nil) {
[sslProperties setObject:(NSString *)[self sslSecurityLevel] forKey:(NSString *)kCFStreamSSLLevel];
}
6) 在調用請求的request中做如下設定:
[request setValidatesSecureCertificate:NO];
[request setSslSecurityLevel:(CFStringRef*)kCFStreamSocketSecurityLevelSSLv3];