AFNetworking github : https://github.com/AFNetworking/AFNetworking
Reachability github : https://github.com/tonymillion/Reachability
先分别介绍一下 AFN 和 Reachability 如何进行网络监测
#import "AFNetworkReachabilityManager.h"
// 如果要检测网络状态的变化,必须用检测管理器的单例的startMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
// 检测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld",status);
}];
// 几种不同的网络状态
/*
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 无线
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
*/
ps : 由于检测网络有一定的延迟,所以如果启动app立即去检测调用[AFNetworkReachabilityManager sharedManager].networkReachabilityStatus 有可能得到的是status == AFNetworkReachabilityStatusUnknown;但是此时明明是有网的,建议在收到监听网络状态回调以后再取[AFNetworkReachabilityManager sharedManager].networkReachabilityStatus。
Reachability
添加框架:SystemConfiguration.framework
#import "Reachability.h"
-(BOOL)isConnectionAvailable{
BOOL isExistenceNetwork = YES;
Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
switch ([reach currentReachabilityStatus]) {
case NotReachable:
isExistenceNetwork = NO;
//NSLog(@"notReachable");
break;
case ReachableViaWiFi:
{ isExistenceNetwork = YES;
// UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"5毛 wifi 5毛 wifi" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
// alert.delegate = self;
// [alert show];
}
break;
case ReachableViaWWAN:
isExistenceNetwork = YES;
//NSLog(@"3G");
break;
}
if (!isExistenceNetwork) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"没有网络连接" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nil, nil];
alert.delegate = self;
[alert show];
return NO;
}
return isExistenceNetwork;
}
如果需要实时的网络状态变化通知,需要用到异步的方式
具体请看: http://www.bubuko.com/infodetail-650914.html
AFNetworking 用法
//GET请求
#import"AFHTTPRequestOperationManager.h"
// 1 初始化
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2 设置返回数据类型
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 3 请求
[manager GET:@"网址字符串" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功代码
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败代码
}];
其中请求成功的话,就可以直接进行JSON解析
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dict);
//POST请求
#import"AFHTTPRequestOperationManager.h"
// 1 初始化
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 2 设置返回数据类型
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 3 请求
[manager POST:@"网址字符串" parameters:dict //参数字典
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功代码
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败代码
}];
其中请求成功的话,就可以直接进行JSON解析
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dict);
/*
注意:
1 AFNetworking可以进行JSON数据解析/Plist数据解析.(不支持XML数据解析)
2 URL字符串中如果有特殊字符或者中文字符,AFNETWorking并没有做UTF8的转码,需要:url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
*/