估計(jì)大家做iOS 開發(fā)時(shí)用的最多的網(wǎng)絡(luò)監(jiān)測就是Reachability,以及各種在此基礎(chǔ)上封裝的一些庫
你看到的上面這張圖就是Reachable,用到最多的就是isReachable,isReachableViaWWAN,isReachableViaWiFi分別表示網(wǎng)絡(luò)是否可用,2g、3g、4g是否可用,wifi是否能用。
但是這個(gè)監(jiān)測網(wǎng)絡(luò)的方法都忽略了一種情況,有WiFi連接但是沒有數(shù)據(jù)傳輸?shù)那闆r。
在這種情況下上面能監(jiān)測到WIFi連接,而沒有數(shù)據(jù)進(jìn)行傳輸,所以就可能給你造成視覺上的影響并且你在這時(shí)候彈出提示有網(wǎng)絡(luò)連接,但是并沒有數(shù)據(jù)傳輸,是不是有種被網(wǎng)絡(luò)欺騙的感覺所以最好的解決方案是改造這個(gè)Reachability,我的想法是通過SCNetworkReachabilityFlags這個(gè)入手,當(dāng)連接wifi的時(shí)候,這個(gè)flags的值是1<<2.只是有這個(gè)想法,還沒有實(shí)施。。。。
當(dāng)然也有個(gè)取巧的方法,你每次用這個(gè)方法的的把它放在網(wǎng)絡(luò)請求里面
- (void) httpRequest:(NSString *)url
withData:(NSDictionary *)postData
requestMethod:(NSString*)httpMethod
failedBlock:(GBHEFailedBlock)failedBlock
completionBlock:(GBHECompletionBlock)completionBlock
{
Reachability *_reach = [Reachability reachabilityForInternetConnection];
if (_reach.isReachable) {
//? ? ? ? [[ToastView getInstance]displayToastWithMessage:@"哈哈"];
}
else{
//? ? ? ? [[ToastView getInstance]displayToastWithMessage:@"請求超時(shí)"];
}
//1..檢查網(wǎng)絡(luò)連接(蘋果公司提供的檢查網(wǎng)絡(luò)的第三方庫 Reachability)
//AFN 在 Reachability基礎(chǔ)上做了一個(gè)自己的網(wǎng)絡(luò)檢查的庫, 基本上一樣
if (isFirst == NO) {
//網(wǎng)絡(luò)只有在startMonitoring完成后才可以使用檢查網(wǎng)絡(luò)狀態(tài)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager]setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
canCHeckNetwork = YES;
}];
isFirst = YES;
}
//只能在監(jiān)聽完善之后才可以調(diào)用
BOOL isOK = [[AFNetworkReachabilityManager sharedManager] isReachable];
//? ? BOOL is3GOK = [[AFNetworkReachabilityManager sharedManager]isReachableViaWWAN];
//網(wǎng)絡(luò)有問題
if(isOK == NO && canCHeckNetwork == YES){
//? ? ? ? NSError *error = [NSError errorWithDomain:@"網(wǎng)絡(luò)錯位" code:100 userInfo:nil];
return;
MyLog(@"網(wǎng)絡(luò)!!");
}
url = [NSString stringWithFormat:@"%s%@",PORTOCOL_APP_ADDR,url];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
manager.requestSerializer.timeoutInterval=10;
NSComparisonResult comparison1 = [httpMethod caseInsensitiveCompare:@"GET"];
NSComparisonResult comparisonResult2 = [httpMethod caseInsensitiveCompare:@"POST"];
if (comparison1 == NSOrderedSame)
{
[manager GET:url parameters:postData success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completionBlock) {
completionBlock(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failedBlock) {
[[ToastView getInstance]displayToastWithMessage:@"請求超時(shí)"];
failedBlock(error);
MyLog(@"%@",error);
}
}];
}
if (comparisonResult2 == NSOrderedSame)
{
BOOL isFile = NO;
for (NSString *key in postData.allKeys) {
id value = postData[key];
if ([value isKindOfClass:[NSData class]]) {
isFile = YES;
break;
}
}
if (!isFile) {//判斷是上傳數(shù)據(jù)還是下請求數(shù)據(jù)
[manager POST:url parameters:postData success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completionBlock) {
completionBlock(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failedBlock) {
[[ToastView getInstance]displayToastWithMessage:@"請求超時(shí)"];
failedBlock(error);
}
}];
}else
{
[manager POST:url
parameters:postData
constructingBodyWithBlock:^(id formData) {
//取出需要上傳的圖片數(shù)據(jù)
for (NSString *key in postData) {
id value = postData[key];
if ([value isKindOfClass:[NSData class]]) {
[formData appendPartWithFileData:value
name:key
fileName:key
mimeType:@"image/jpeg"];
}
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completionBlock) {
completionBlock(responseObject);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failedBlock) {
[[ToastView getInstance]displayToastWithMessage:@"請求超時(shí)"];
failedBlock(error);
}
}];
}
}
}