监听网络状态大家都不陌生,尤其是使用AFNetwork监听,
我的思路是对AFNetwork进行二次封装,然后直接以属性的形式输出结果
#pragma mark - 属性 /// 网络状态 @property (nonatomic, assign, readonly) NetworkState state;
@interface NetworkStateTool () @property (nonatomic, assign, readwrite) NetworkState state; @end
#pragma mark -- 开启网络监听 - (void)startNetworkStateMonitoring { AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager]; //开启网络监听 [mgr startMonitoring]; [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: // 未知网络 NSLog(@"未知网络"); self.state = NetworkStateUnknown; break; case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网) NSLog(@"没有网络"); self.state = NetworkStateNone; break; case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络 NSLog(@"手机自带网络"); self.state = NetworkStateWWAN; break; case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI NSLog(@"WIFI"); self.state = NetworkStateWiFi; break; } }]; }
按照官方的说法,我们只需要调用一次startNetworkStateMonitoring方法,
即只需要调用startMonitoring方法一次,即可在setReachabilityStatusChangeBlock中收到实时结果
实测:
WIFI--->断网 可以实时监测
但是
断网--->WIFI 无法实时监测,即setReachabilityStatusChangeBlock中收不到结果
只有重新调用setReachabilityStatusChangeBlock方法,才可以拿到实时结果
故修改代码如下:直接通过方法获取
+ (NetworkState)networkState { NetworkState __block state; AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager]; [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: // 未知网络 NSLog(@"未知网络"); state = NetworkStateUnknown; break; case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网) NSLog(@"没有网络"); state = NetworkStateNone; break; case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络 NSLog(@"手机自带网络"); state = NetworkStateWWAN; break; case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI NSLog(@"WIFI"); state = NetworkStateWiFi; break; } }]; //开启网络监听 [mgr startMonitoring]; return state; }