当前位置: 首页 > news >正文

iOS网络监测区分2、3、4G

欢迎大家关注我的公众号,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来

文章也会同步更新到我的博客:
ppsheep.com

如果有在使用AFNetworking朋友知道,在AF里只能区分当前网络是WiFi网络还是蜂窝网络在3G、4G出现以后,我们就有一个新需求,需要区分2G、3G、4G网络了,虽然同为蜂窝网络但是速度可是千差万别,有时我们会感觉到4G比WiFi还快,当然流量也是跑的相当肉痛

下面我们就来讲一讲怎么区分2G 3G 4G网络

下载Reachability

首先我们需要下载苹果官方的一个示例工程

developer.apple.com/library/con…

在这个工程里有我们需要用到的 苹果官方提供的实时监测网络的类 我们是在这个基础上 稍作修改就可以做到

进入网页

1

在示例代码中 将Reachability类拷贝到我们的项目当中

2

修改Reachability

首先修改Reachability类中的网络类型枚举:

typedef enum : NSInteger {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN,
    kReachableVia2G,
    kReachableVia3G,
    kReachableVia4G
} NetworkStatus;复制代码

然后再.m文件中 找到方法

- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags;复制代码

增加判断2G 3G 4G的方法
在 if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) 判断中加上代码

if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
        returnValue = ReachableViaWWAN;

        CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
        NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
        if (currentStr) {
            if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
                return kReachableVia4G;
            }else if ([currentStr isEqualToString:CTRadioAccessTechnologyGPRS]|| [currentStr isEqualToString:CTRadioAccessTechnologyEdge]){
                return kReachableVia2G;
            }else{
                return kReachableVia3G;
            }
        }

        if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
            if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
                return kReachableVia2G;
            }
            return kReachableVia3G;
        }
        return ReachableViaWWAN;
    }复制代码

在需要用到的地方引入我们修改过后的Reachability

使用Reachability

监听网络变化

//添加网络监测
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChanged:)
                                                 name: kReachabilityChangedNotification
                                               object: nil];

    //开启网络监测
    self.intertReach = [Reachability reachabilityForInternetConnection];
    [self.intertReach startNotifier];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 300, 30)];
    [self.view addSubview:label];
    self.label = label;

    //获取当前的网络状态
    NetworkStatus status = [self.intertReach currentReachabilityStatus];
    [self judgeNetWorkStatus:status];复制代码

当网络发生改变时 会触发

/**
 当网络状态发生变换时 会触发这个方法

 @param no 通知
 */
- (void)reachabilityChanged:(NSNotification *)no{
    Reachability* curReach = [no object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    NetworkStatus status = [curReach currentReachabilityStatus];
    [self judgeNetWorkStatus:status];
}复制代码

还是很简单的

源代码 放在了

github.com/yangqian111…

相关文章:

  • 剑指offer---3、按之字形顺序打印二叉树
  • 艾森尼克:提供高品质大通量RO膜,树立滤芯行业新标杆!
  • 《JAVA——帮你解决高并发秒杀》
  • MyBatis源码分析-MyBatis初始化流程
  • 左神算法进阶班1_4Manacher算法
  • centos下安装mysql5.7
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  • PHP删除MySQL数据库下的所有数据表
  • 记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新
  • 数组相关排序
  • 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  • Java基础学习总结(23)——GUI编程
  • JDBC 通过PreparedStatement 对数据库进行增删改查
  • JPA常用注解
  • 10个最佳ES6特性 ES7与ES8的特性
  • CSS 提示工具(Tooltip)
  • EOS是什么
  • extjs4学习之配置
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java中具有继承关系的类及其对象初始化顺序
  • jQuery(一)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode29.两数相除 JavaScript
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 回顾 Swift 多平台移植进度 #2
  • 通过git安装npm私有模块
  • 线上 python http server profile 实践
  • nb
  • #传输# #传输数据判断#
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (二)hibernate配置管理
  • (十一)c52学习之旅-动态数码管
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Dubbo快速入门、介绍、使用
  • (转)nsfocus-绿盟科技笔试题目
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)原始图像数据和PDF中的图像数据
  • *上位机的定义
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .Net Remoting常用部署结构
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET是什么
  • .NET学习全景图
  • .NET中 MVC 工厂模式浅析
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @SuppressWarnings注解
  • [Android] Amazon 的 android 音视频开发文档
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [Git].gitignore失效的原因