封裝改了好多次,一直沒更新這里
新增 -取消請求
-網(wǎng)絡(luò)監(jiān)聽
-https證書
1.手機網(wǎng)絡(luò)監(jiān)聽
蘋果官方有提供一個 Reachablity 來檢測用戶網(wǎng)絡(luò)情況, 但是項目中如果導入 AFNetworking 的話,就沒必要再用 Reachablity 了.
pragma mark - 開啟手機網(wǎng)絡(luò)的監(jiān)聽
-
(void)startNotificationNetworkStatus
{
[NetWork shareInstance].currentNetworkStatus = NO;AFNetworkReachabilityManager *networkStatusManage = [AFNetworkReachabilityManager sharedManager];
[networkStatusManage setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未識別的網(wǎng)絡(luò)");
[NetWork shareInstance].currentNetworkStatus = NO;
[NetWork shareInstance].netStatus = NetworkStatusNoNet;
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"網(wǎng)絡(luò)連接已斷開");
[NetWork shareInstance].currentNetworkStatus = NO;
[NetWork shareInstance].netStatus = NetworkStatusNoNet;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"當前網(wǎng)絡(luò)為移動網(wǎng)絡(luò)");
[NetWork shareInstance].currentNetworkStatus = YES;
[NetWork shareInstance].netStatus = NetworkStatusMobile;
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"當前網(wǎng)絡(luò)為Wifi網(wǎng)絡(luò)");
[NetWork shareInstance].currentNetworkStatus = YES;
[NetWork shareInstance].netStatus = NetworkStatusWifi;
break;
default:
break;
}
}];
[networkStatusManage startMonitoring];
}
pragma mark - 返回當前網(wǎng)絡(luò)是否可用
- (BOOL)getCurrentNetworkStatus
{
return [NetWork shareInstance].currentNetworkStatus;
}
pragma mark - 返回當前的網(wǎng)絡(luò)狀態(tài)
- (NetworkStatus)returnCurrentNetworkStatus
{
return [NetWork shareInstance].netStatus;
}
2.取消請求
在NSURLSession開發(fā)中,所有的任務都是由session發(fā)起的
AFNetworking 3.0 之后,都是基于 NSURLSession
AF中調(diào)用請求 會返回一個 NSURLSessionDataTask 對象
可以先把這個對象添加到隊列,當然,需要先創(chuàng)建一個隊列管理的容器
pragma mark - 隊列管理容器
- (NSMutableDictionary *)taskQueue
{
NSMutableDictionary * taskDic = objc_getAssociatedObject(self, @selector(addTask:));
if (!taskDic) {
taskDic = @{}.mutableCopy;
objc_setAssociatedObject(self, @selector(addTask:), taskDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return taskDic;
}
pragma mark - 添加隊列
- (void)addTask:(NSURLSessionDataTask *)task
{
NSMutableDictionary * taskQueue = [self taskQueue];
[taskQueue setObject:task forKey:@(task.taskIdentifier)];
}
請求返回結(jié)果后,需要從隊列移除.刪除的時候,最好先判斷是否存在隊列
pragma mark - 判斷有沒有執(zhí)行中的隊列
- (BOOL)isRequesting
{
NSMutableDictionary * taskDic = objc_getAssociatedObject(self, @selector(addTask:));
if (taskDic.allValues.count > 0) {
return YES;
}
return NO;
}
pragma mark - 刪除隊列
- (void)removeTask:(NSURLSessionDataTask *)task
{
if ([self isRequesting]) {
NSMutableDictionary * taskQueue = [self taskQueue];
[taskQueue removeObjectForKey:@(task.taskIdentifier)];
}
}
pragma mark - 取消請求
-
(void)cancelRequest
{
if ([self isRequesting]) {
NSMutableDictionary * taskQueue = [self taskQueue];
[taskQueue enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if (((NSURLSessionDataTask *)obj).state != NSURLSessionTaskStateCompleted ) {
[((NSURLSessionDataTask *)obj) cancel];
}
}];}
}
3.蘋果要求必須https,需要自簽名證書
其實用AF的話很簡單
pragma mark - 設(shè)置證書
- (AFSecurityPolicy*)customSecurityPolicy
{
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"證書名" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:certData,nil];
return securityPolicy;
}