美文网首页
iOS - 网络连接检测-RealReachability

iOS - 网络连接检测-RealReachability

作者: CDLOG | 来源:发表于2018-07-25 17:43 被阅读198次

可以监测是不是真的联网了。

导入框架

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判断是否加载,也会造成回调失败。

github地址https://github.com/CDLOG/CL_RealReachability

相关文章

网友评论

      本文标题:iOS - 网络连接检测-RealReachability

      本文链接:https://www.haomeiwen.com/subject/iotmmftx.html