可以监测是不是真的联网了。
导入框架
pod 'RealReachability'
配置
在appdelegate中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 开始监听网络状态
[GLobalRealReachability startNotifier];
GLobalRealReachability.hostForPing = @"www.baidu.com";
}
使用
//接受通知
- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(networkChanged:)
name:kRealReachabilityChangedNotification
object:nil];
}
//通知方法
- (void)networkChanged:(NSNotification *)notification
{
RealReachability *reachability = (RealReachability *)notification.object;
ReachabilityStatus status = [reachability currentReachabilityStatus];
NSLog(@"currentStatus:%@",@(status));
[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {
switch (status)
{
case RealStatusNotReachable:
{
[self.view showError:@"失去网络连接"];
NSLog(@"RealStatusNotReachable");
// case NotReachable handler
break;
}
case RealStatusViaWiFi:
{
// case WiFi handler
[self.view showLoadMessageAtCenter:@"已连接WiFi网络"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.view hide];
});
NSLog(@"RealStatusViaWiFi");
break;
}
case RealStatusViaWWAN:
{
// case WWAN handler
[self.view showLoadMessageAtCenter:@"已连接蜂窝网络"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.view hide];
});
NSLog(@"RealStatusViaWWAN");
break;
}
default:
break;
}
}];
}
补充
可以使用一个属性来记录当前网络状态,进行其他逻辑判断
self.isNet = [GLobalRealReachability currentReachabilityStatus];
实际开发的使用
在appdelegate中,根控制器监听网络状态,用于显示hud
在全局配置类中,用一个属性isNet来保存网络状态,监听网络状态的改变,其他类根据该类的这个属性来判断是否有网,进行其他的操作。
其他类判断是否有网时可以加入网络状态的block回调
block属性在配置类
[self getRealBalance];
__weak typeof(self) weakself = self;
[NSTConfig instance].change_net_block = ^{
[weakself getRealBalance];
};
if (![NSTConfig instance].isNet) {
NSLog(@"bool value: %@" ,[NSTConfig instance].isNet?@"YES":@"NO");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.view showError:@"没有网络连接,请检查网络后重试"];
});
return;
}
遇到的坑
回调时一定要将self用weak修饰,否则会强引用前一个控制器,但是前一个控制器可能已经被销毁了,造成回调的失败,而且是一定要加载回调,而不是用ifelse判断是否加载,也会造成回调失败。
网友评论