在网络应用中,需要对用户设备的网络状态进行实时监控,有两种方法:
第一种:AFNetworkReachabilityManager
需要导入头文件 #import <AFNetworking.h>
+ (void)monitorNetworking {
AFNetworkReachabilityManager *manage = [AFNetworkReachabilityManager sharedManager];
[manage setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown: // 未知网络
{
NSLog(@"未知网络");
}
break;
case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网)
{
NSLog(@"没有网络(断网)");
[MBProgressHUD showError:@"网络异常,请检查网络设置!"];
}
break;
case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络
{
NSLog(@"手机自带网络");
}
break;
case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI
{
NSLog(@"WIFI");
}
break;
}
}];
// 开始监控
[manage startMonitoring];
}
第二种:Reachability
在AppDelegate.m中
1 @property (nonatomic, strong) Reachability *reach; 2 3 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 4 5 // 监测网络情况 6 [[NSNotificationCenter defaultCenter] addObserver:self 7 selector:@selector(reachabilityChanged:) 8 name: kReachabilityChangedNotification 9 object: nil]; 10 Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"]; 11 [reach startNotifier]; 12 self.reach = reach; 13 }
通知触发执行的方法
1 #pragma mark - 网络状态变化通知 2 - (void)reachabilityChanged:(NSNotification*)note { 3 4 Reachability* curReach = [note object]; 5 NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 6 NetworkStatus status = [curReach currentReachabilityStatus]; 7 8 /* 9 NotReachable = 0, 无网络连接 10 ReachableViaWiFi, Wifi 11 ReachableViaWWAN 2G/3G/4G/5G 12 */ 13 if (status == NotReachable) { 14 15 // 没有网络的更多操作 16 // 实现类似接到电话效果 self.window.frame = CGRectMake(0, 40, __width, __height-40); 17 18 } else if (status == ReachableViaWiFi) { 19 NSLog(@"Wifi"); 20 } else { 21 NSLog(@"3G/4G/5G"); 22 } 23 }
1 - (void)dealloc { 2 [_reach stopNotifier]; 3 [[NSNotificationCenter defaultCenter] removeObserver:self]; 4 }