代码改变世界

iOS开发系列-网络状态监控

2018-04-21 18:55  iCoderHong  阅读(659)  评论(0编辑  收藏  举报

概述

在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户。
一般在网络状态不好的场景下需要做一些处理比如:

  • 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;