美文网首页集思广益iOS iOS学习
iOS--另辟蹊径监听网络类型及状态

iOS--另辟蹊径监听网络类型及状态

作者: Go_Spec | 来源:发表于2016-06-28 20:20 被阅读598次

    对App进行实时的网络状态监听也是项目中的一项比较重要的功能.
    在写项目的时候也查阅了很多资料,基本就两种方法:Reachability和AFNetworking两种方法.
    这两种方法的具体实现方法在简书上都有很多很不错的文章讲过
    但这篇文章我想讲讲查到的另一个判断网络类型的方法---通过状态栏判断网络类型

    我的项目内采用的是AFNetworkReachabilityManager,它的底层代码就是对系统的Reachability的二次封装,使用起来能更方便些.话不多说了,看一下具体的实现

    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
                switch (status)
                {
                    //结合MBProgressHUD进行显示:
                    case -1:  //AFNetworkReachabilityStatusUnknown
                    {
                        //提示框:
                        MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                        textOnlyHUD.mode = MBProgressHUDModeText;
                        textOnlyHUD.labelText = @"未知网络";
                        [textOnlyHUD hide:YES afterDelay:1.f];
                    }
                        break;
                    case 0:  //AFNetworkReachabilityStatusNotReachable
                    {
                        //提示框:
                        MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                        textOnlyHUD.mode = MBProgressHUDModeText;
                        textOnlyHUD.labelText = @"无法连接";
                        [textOnlyHUD hide:YES afterDelay:1.f];
                    }
                        break;
                    case 1:  //AFNetworkReachabilityStatusReachableViaWWAN
                    {
                        //这里是本文的核心点:采用遍历查找状态栏的显示网络状态的子视图,通过判断该子视图的类型来更详细的判断网络类型
                        NSArray *subviewArray = [[[[UIApplication sharedApplication] valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
                        int type = 0;
                        for (id subview in subviewArray)
                        {
                            if ([subview isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")])
                            {
                                type = [[subview valueForKeyPath:@"dataNetworkType"] intValue];
                        }
                        switch (type)
                        {
                            case 1:
                            {
                                //提示框:
                                MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                                textOnlyHUD.mode = MBProgressHUDModeText;
                                textOnlyHUD.labelText = @"当前为2G网络";
                                [textOnlyHUD hide:YES afterDelay:1.f];
                            }
                                break;
                            case 2:
                            {
                                //提示框:
                                MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                                textOnlyHUD.mode = MBProgressHUDModeText;
                                textOnlyHUD.labelText = @"当前为3G网络";
                                [textOnlyHUD hide:YES afterDelay:1.f];
                            }
                                break;
                            case 3:
                            {
                                //提示框:
                                MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                                textOnlyHUD.mode = MBProgressHUDModeText;
                                textOnlyHUD.labelText = @"当前为4G网络";
                                [textOnlyHUD hide:YES afterDelay:1.f];
                            }
                                break;
                                
                            default:
                                break;
                        }
                    }
                }
                    break;
                case 2:  //AFNetworkReachabilityStatusReachableViaWiFi
                {
                    //提示框:
                    MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                    textOnlyHUD.mode = MBProgressHUDModeText;
                    textOnlyHUD.labelText = @"当前为WIFI";
                    [textOnlyHUD hide:YES afterDelay:1.f];
                }
                    break;
                    
                default:
                {
                    //提示框:
                    MBProgressHUD *textOnlyHUD = [MBProgressHUD showHUDAddedTo:self.tabBarController.view animated:YES];
                    textOnlyHUD.mode = MBProgressHUDModeText;
                    textOnlyHUD.labelText = @"无网络连接";
                    [textOnlyHUD hide:YES afterDelay:1.f];
                }
                    break;
            }
        }];
        
        //开始监测
        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    

    最后的实现效果:

    WIFI
    3G

    此方法最大的好处就是能够更详细的监听网络类型,能够和用户的视觉信息一致,会有更好的用户体验.(个人感觉)希望能够给大家一点收获,我觉得拓宽思路,这种方法还能有更高的使用价值
    (ps:如有任何问题,欢迎随时找我交流,共同进步🤓)

    相关文章

      网友评论

      • 6ea54dc08ca1:你好 请问一下你这个网络demo能不能分享一下呢 谢谢
      • 随风风流:这个监听网络状态很准确,但是好像只能监听一次,在首次连接网络的时候能够显示网络状态,断开网络的时候能够弹出提示“网络未连接”,但是频繁的断开网络和连接网络都只能提示一次。如何做到实时监听网络状态呢?
        随风风流:@Go_Spec 不好意思刚刚是在模拟器上只会出现一次效果,真机上是可行的,但是如何在没有网络的时候用户试图发起网络请求的时候都提醒一次呢?
        Go_Spec:@随风风流 我在项目中的实现效果就是动态切换网络时都会弹出提示框,比如切换无线和3G网络时没次都会弹出
      • 037ec15c586d:好
        Go_Spec:@美好的美好 多谢:pray:
      • Fooler:嗯,的确是个好方法,其实简书首页显示的内容跟自己的关注点还是有一定联系的,我看到比较多的就是技术文了,,
        Go_Spec:@我是一朵向阳花 嗯,每个人的首页都不同:smile:
      • 赤脊山的豺狼人:博主这个思路很有想法~我之前用的是RealReachability~功能也蛮强大,推荐给博主。
        Go_Spec:@赤脊山的豺狼人 共同进步:pray:多谢推荐

      本文标题:iOS--另辟蹊径监听网络类型及状态

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