這是我在簡書發(fā)的第一篇技術(shù)文章, 在工作間隙我覺得還是有必要把工作中遇到的問題, 包括調(diào)研的一些知識點做一個記錄, 希望可以對大家有所幫助.
長話短說, 直接上干貨!
ATS是在2015年由蘋果引入的強化網(wǎng)絡傳輸安全的標準引矩,要求所有的App在從Web端獲取數(shù)據(jù)的時候都要使用安全的HTTPS鏈接梁丘,并進一步強調(diào)要使用最新的TLS1.2版本的HTTPS。
首先需要服務器端升級到https旺韭,拿到服務器哥們提供的server.pem證書文件氛谜,并導入到項目中
- (AFSecurityPolicy *)customSecurityPolicy
{
/* 導入證書 (證書在這里暫時不能公開, 防止盜用, 主要看實現(xiàn)代碼吧)**/
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"duoyundong.yoger.cn" ofType:@"cer"];//證書的路徑
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
/* 如果是需要驗證自建證書,需要設置為YES**/
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
/** 如果certData為空會導致崩潰問題, 這里需要加一個判斷*/
if (certData) {
securityPolicy.pinnedCertificates = [NSSet setWithArray:@[certData]];
}
return securityPolicy;
}
/*** 具體還是下載測試項目, 代碼以項目為準 ***/
/**
* 網(wǎng)絡請求 (POST / GET)
*
* @param path 接口拼接路徑
* @param params 請求體
* @param method get / post
* @param successBlock 成功
* @param failureBlock 失敗
* @param refreshBlock 刷新
*/
- (void)sendRequestPath:(NSString *)path
params:(NSDictionary *)params
method:(NSString *)method
success:(APISuccessBlock)successBlock
failure:(APIFailureBlock)failureBlock
error:(APIRefreshBlock)refreshBlock
{
/** 實時監(jiān)測網(wǎng)絡狀態(tài)*/
[[NetworkJudgement defaultInstance] judgeNetWorkIsAvailable];
/** 初始化通知(斷網(wǎng)時接收)*/
[self receiveNotification];
NSString *fullPath = [NSString stringWithFormat:kMainUrl_HTTPS, path];
_sessionManager = [AFHTTPSessionManager manager];
_sessionManager.securityPolicy.allowInvalidCertificates = YES;
_sessionManager.requestSerializer.timeoutInterval = kRequestTimeOutInterval;
_sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
[_sessionManager.responseSerializer setAcceptableContentTypes: [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css", nil]];
// 驗證HTTP+SSL證書
[_sessionManager setSecurityPolicy:[self customSecurityPolicy]];
if ([[method lowercaseString] isEqualToString:@"get"]) {
if(IOS_VERSION <= 7.0f) {
fullPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
} else {
fullPath = [fullPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
}
[_sessionManager GET:fullPath parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[self successDataTask:task ResponseObject:responseObject success:successBlock failure:failureBlock refresh:refreshBlock];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self errorOperation:failureBlock refresh:refreshBlock];
}];
} else if ([[method lowercaseString] isEqualToString:@"post"]) {
if(IOS_VERSION <= 7.0f) {
fullPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
} else {
fullPath = [fullPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
}
[_sessionManager POST:fullPath parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
[self successDataTask:task ResponseObject:responseObject success:successBlock failure:failureBlock refresh:responseObject];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
failureBlock(error);
// [self errorOperation:failureBlock refresh:refreshBlock];
}];
}
}
AFN常見錯誤
//1.創(chuàng)建一個管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//1.0 改請求的默認的序列化方式 改成JSON格式的請求(請求為json格式的二進制)
//會把字典区端,數(shù)組轉(zhuǎn)化成json格式的二進制傳給服務器值漫。
//默認情況下是普通的二進制,實現(xiàn)此方法改為JSON格式的二進制
manager.requestSerializer = [AFJSONRequestSerializer serializer];
//1.1 改默認的響應反序列化方式 改為普通二進制(服務器返回的是二進制织盼,afn不做處理)杨何。
//默認情況下 afn會做二進制轉(zhuǎn)為json的格式的處理。然后我們自己把json轉(zhuǎn)成數(shù)組悔政,或字典晚吞。
//實現(xiàn)此方法后不做處理延旧,直接將二進制說句給你谋国。也不再需要1.2 增加默認的返回方式(JSON)的可接收的類型。
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//1.2 增加默認的返回方式(JSON)的可接收的類型
//manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];
常見問題
注意:如果服務器升級到TLS1.1還是不行的迁沫,因為蘋果要求使用TLS1.2 SSL加密請求數(shù)據(jù)芦瘾。會造成無法接受數(shù)據(jù)
其他相關(guān)文章推薦
淺談iOS語音識別+語音播報
iOS開發(fā)中 weak和assign的區(qū)別
Objective-C沙盒結(jié)構(gòu)
淺談AutoreleasePool底層是如何實現(xiàn)的?
iOS開發(fā)中內(nèi)聯(lián)函數(shù)(UIKIT_STATIC_INLINE)的使用
鄧白氏編碼(DUNS)申請流程 (史上最全)
AppStore個人開發(fā)者賬號升級為公司賬號(鄧白氏碼DUNS申請等)