概述
在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户。
一般在网络状态不好的场景下需要做一些处理比如:
- WIFT/3G/4G网络:自动下载高清图。网络不好的场景下载缩略图。
- 没有网络显示离线的缓存数据
网络监控
方案一
苹果官方的Reachability示例程序。
下载地址 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip
Reachability获取当前的网络
Reachability *reachability[Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [reachability currentReachabilityStatus];
switch (netStatus) {
case NotReachable:
NSLog(@"----------没有网络");
break;
case ReachableViaWWAN:
NSLog(@"----------蜂窝网络");
break;
case ReachableViaWiFi:
NSLog(@"----------连接wifi");
break;
default:
Reachability监听网络
Reachability监听网络是通过通知kReachabilityChangedNotification
的方式来通知网络的改变。在监听的过程中需要保证Reachability实例不能释放。
// 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
// 开始监听
[self.reachability startNotifier];
/*!
* Called by Reachability whenever status changes.
*/
- (void) reachabilityChanged:(NSNotification *)note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
// 自己获取网络
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus) {
case NotReachable:
NSLog(@"----------网络有问题");
break;
case ReachableViaWWAN:
NSLog(@"----------蜂窝网络");
break;
case ReachableViaWiFi:
NSLog(@"----------连接wifi");
break;
default:
break;
}
}
方案二
使用AFNetworking框架中的AFNetworkReachabilityManager
。AFNetworkReachabilityManager也是基于苹果的Reachability实现的。
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 设置开始监听在设置setReachabilityStatusChangeBlock之前
[manager startMonitoring];
// 设置网络监听
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
/**
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1, // 为止网络
AFNetworkReachabilityStatusNotReachable = 0, // 没有联网
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 手机自带网络
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WIFI
};
*/
NSLog(@"--------------%ld", status);
}];
AFNetworkReachabilityManager被AFN框架内部强引用者,不需要外部再次强引用。
另外AFNetworkReachabilityManager提供了一一些获取网络状态的类方法
@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable;
@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN;
@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi;