前言

5G 什么的,还得等苹果API升级啊,不过将来还是这个处理过程就是了。

关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如果判断的API。而在撸WebRTC音视频通话的时候,看到了Demo中将SCNetworkReachability与其结合,当网络环境改变时,判断当前连接的是什么网络环境,写法欠佳(因为将其与WebRTC的其他逻辑柔和在了一个类)。其实只需要将官方的Reachability做一下改进就行了。

怎么判断当前的网络环境

我们可以利用#import 框架下的一些API来判断当前的网络。

先来看一下该框架下的一些常量定义:

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

这不就是2G/3G/4G等网络环境么?我想等5G普及之后,苹果肯定也会加入代表5G的常量定义的。

先看随手写的一个网络环境判断:

- (void)networkStatus

{

NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,

CTRadioAccessTechnologyGPRS,

CTRadioAccessTechnologyCDMA1x];

NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,

CTRadioAccessTechnologyWCDMA,

CTRadioAccessTechnologyHSUPA,

CTRadioAccessTechnologyCDMAEVDORev0,

CTRadioAccessTechnologyCDMAEVDORevA,

CTRadioAccessTechnologyCDMAEVDORevB,

CTRadioAccessTechnologyeHRPD];

NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];

NSString *accessString = teleInfo.currentRadioAccessTechnology;

if ([typeStrings4G containsObject:accessString]) {

NSLog(@"4G网络");

} else if ([typeStrings3G containsObject:accessString]) {

NSLog(@"3G网络");

} else if ([typeStrings2G containsObject:accessString]) {

NSLog(@"2G网络");

} else {

NSLog(@"未知网络");

}

} else {

NSLog(@"未知网络");

}

}

代码中的currentRadioAccessTechnology是iOS 7之后新版加的API。

改进Reachability

在iOS应用中的使用场景肯定不是主动获取,应该是网络产生变化的时候,自动给出通知等,然后做一些相应的处理。下面我们就自己撸一个Reachability,然后给出当前的网络环境。

我们都知道,使用Reachability时,如果网络变化,会给出一个通知,但是我们获取的网络状态只有WiFi/WWAN/NotReach几种。我们可以在Reachability返回的通知里,WWAN这种类型下,再做上面的网络判断就行了。但是更优的做法就将判断放在Reachability中,在使用的时候直接返回不同的网络状态。

由于最新版的Reachability已经支持了IPV6,我也是在最新版的Reachability上做了一些改进。

大部分方法跟Reachability一样,我扩展了枚举类型,改了网络状态判断。

主要改如下:

typedef NS_ENUM(NSUInteger, HLNetWorkStatus) {

HLNetWorkStatusNotReachable = 0,

HLNetWorkStatusUnknown = 1,

HLNetWorkStatusWWAN2G = 2,

HLNetWorkStatusWWAN3G = 3,

HLNetWorkStatusWWAN4G = 4,

HLNetWorkStatusWiFi = 9,

};

这里是网络类型判断的改:

- (HLNetWorkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags

{

if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)

{

// The target host is not reachable.

return HLNetWorkStatusNotReachable;

}

HLNetWorkStatus returnValue = HLNetWorkStatusNotReachable;

if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)

{

/*

If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi...

*/

returnValue = HLNetWorkStatusWiFi;

}

if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||

(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))

{

/*

... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs...

*/

if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)

{

/*

... and no [user] intervention is needed...

*/

returnValue = HLNetWorkStatusWiFi;

}

}

if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)

{

/*

... but WWAN connections are OK if the calling application is using the CFNetwork APIs.

*/

NSArray *typeStrings2G = @[CTRadioAccessTechnologyEdge,

CTRadioAccessTechnologyGPRS,

CTRadioAccessTechnologyCDMA1x];

NSArray *typeStrings3G = @[CTRadioAccessTechnologyHSDPA,

CTRadioAccessTechnologyWCDMA,

CTRadioAccessTechnologyHSUPA,

CTRadioAccessTechnologyCDMAEVDORev0,

CTRadioAccessTechnologyCDMAEVDORevA,

CTRadioAccessTechnologyCDMAEVDORevB,

CTRadioAccessTechnologyeHRPD];

NSArray *typeStrings4G = @[CTRadioAccessTechnologyLTE];

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

CTTelephonyNetworkInfo *teleInfo= [[CTTelephonyNetworkInfo alloc] init];

NSString *accessString = teleInfo.currentRadioAccessTechnology;

if ([typeStrings4G containsObject:accessString]) {

return HLNetWorkStatusWWAN4G;

} else if ([typeStrings3G containsObject:accessString]) {

return HLNetWorkStatusWWAN3G;

} else if ([typeStrings2G containsObject:accessString]) {

return HLNetWorkStatusWWAN2G;

} else {

return HLNetWorkStatusUnknown;

}

} else {

return HLNetWorkStatusUnknown;

}

}

return returnValue;

}

改进后的Reachability用法

为了便于使用,尽量按照Reachability的做法来处理,所以用法与之前没什么太大区别,就换了个通知而已。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kNetWorkReachabilityChangedNotification object:nil];

HLNetWorkReachability *reachability = [HLNetWorkReachability reachabilityWithHostName:@"www.baidu.com"];

self.hostReachability = reachability;

[reachability startNotifier];

// 通知处理

- (void)reachabilityChanged:(NSNotification *)notification

{

HLNetWorkReachability *curReach = [notification object];

HLNetWorkStatus netStatus = [curReach currentReachabilityStatus];

switch (netStatus) {

case HLNetWorkStatusNotReachable:

NSLog(@"网络不可用使用的");

break;

case HLNetWorkStatusUnknown:

NSLog(@"未知网络");

break;

case HLNetWorkStatusWWAN2G:

NSLog(@"2G网络");

break;

case HLNetWorkStatusWWAN3G:

NSLog(@"3G网络");

break;

case HLNetWorkStatusWWAN4G:

NSLog(@"4G网络");

break;

case HLNetWorkStatusWiFi:

NSLog(@"WiFi");

break;

default:

break;

}

}

完美Demo地址:HLNetWorkReachability (本地下载)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习网上卖,谢谢大家对乐购源码的支持。

如何检测android手机是否支持3g网络或者4g网络 源码,iOS中怎么判断当前网络环境是2G/3G/4G/5G/WiFi...相关推荐

  1. android canvas 保存图片,ionic3 html5 video 抓图保存到手机相册,解决Android手机不支持Canvas drawImage问题...

    当然百度出上W条答案 上代码,相信下面代码和小伙伴大同吧 相信好多做webview app的小伙伴们都有同样的问题,在pc上能轻松实现video 抓图.但是在android手机大多是不支持canvas ...

  2. Android毕业设计——基于Android+Eclipse的手机安全卫士设计与实现(毕业论文+程序源码)——手机安全卫士

    基于Android+Eclipse的手机安全卫士设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Android+Eclipse的手机安全卫士设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  3. 转载自搜狐科技【技术那些事儿】LTE网络中的用户数据库HSS与传统2G/3G的HLR有何区别?能否融合组网?...

    [技术那些事儿]LTE网络中的用户数据库HSS与传统2G/3G的HLR有何区别?能否融合组网? EPS HSS与HLR分别负责4G用户数据和2G/3G用户数据的存储,主要存在的两大不同为: (1)所存 ...

  4. delphi XE模拟Android手机PDA设备的虚拟键盘按键及扫码过程输入焦点及信号接收

    delphi XE模拟Android手机PDA设备的虚拟键盘按键及扫码过程输入焦点及信号接收 今天,群里有几位同学讨论这个问题,汇总了一下,分享出来,供同学们学习研究. 一.直接上代码示例 1.屏蔽应 ...

  5. Android传感器之-方向传感器Orientation功能实现与源码

    先明确一下空间坐标系的三个方向: x 方向就是手机的水平方向,右为正: y 方向就是手机的水平垂直方向,前为正: z 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负. 方向角的定义是手机y ...

  6. android 活体识别人脸动作活体静默活体Demo源码实现讲解

    android 活体识别人脸动作活体静默活体Demo源码实现讲解 这里说活体是基于单目摄像头活体,适合所有普通安卓Android 单目摄像头的手机,双目的需要硬件支持,这里不讲述 . 百度网盘体验地址 ...

  7. Android Glide图片加载框架(二)源码解析之load()

    文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...

  8. java毕业设计——基于java+Eclipse+jsp的网上手机销售系统设计与实现(毕业论文+程序源码)——网上手机销售系统

    基于java+Eclipse+jsp的网上手机销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Eclipse+jsp的网上手机销售系统设计与实现,文章末尾附有本毕业设计的 ...

  9. asp毕业设计——基于asp+sqlserver的在线手机销售系统设计与实现(毕业论文+程序源码)——在线手机销售系统

    基于asp+sqlserver的在线手机销售系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+sqlserver的在线手机销售系统设计与实现,文章末尾附有本毕业设计的论文和源码下 ...

  10. 【附源码】计算机毕业设计java休闲网络宾馆管理设计与实现

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

最新文章

  1. 初次体验hiphop-php
  2. Android必备:Android的体系结构
  3. 为什么 Biopython 的在线 BLAST 这么慢?
  4. Enigma Virtual Box:生成可执行文件。
  5. json格式的字符串转为json对象遇到特殊字符问题解决
  6. 三年开发项目经验总结
  7. 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found
  8. vue中v-html指令的使用之Vue知识点归纳(三)
  9. 阿里fastjson 对象转JSON
  10. 企业图纸无纸化,企业图纸安全使用和传输解决方案
  11. ios 二维码扫描(微信二维码扫描音效)
  12. php qq邮箱验证码不显示图片,qq邮箱邮件图片不显示怎么解决-解决qq邮箱邮件图片不显示的方法 - 河东软件园...
  13. 我赢助手详解:抖音变现目前流行的是七种方式之直播变现和Ip变现
  14. w7如何关闭计算机防火墙,win7怎么关闭防火墙 win7自带防火墙启用或关闭方法
  15. 团队管理2 | 管理的天时、地利、人和
  16. Android应用开发之RelativeLayout (相对布局)+梅花效果案例
  17. python脚本windows环境下权限问题处理
  18. CSS简单入门(一)
  19. document.title获取当前网页的标题
  20. 如何在Github上配置ssh key的密钥

热门文章

  1. 转:红帽旗下Linux的版本说明RedHat、CentOS、Fedora、OEL等
  2. 古典乐器网页设计成品 大学生音乐网站制作模板 大学生静态音乐HTML网页源码 dreamweaver网页作业 简单网页课程成品
  3. spring boot 接入xxl-job手册
  4. Please use torch.load with map_location=torch.device(‘cpu‘),If you are running on a CPU-only machine
  5. 计算机硬件系统的运算器又称为,2016计算机专业知识:计算机硬件系统(一)...
  6. 全年腾飞计划笔记(腾飞笔记)
  7. 【FTP】错误描述:200 Switching to ASCII mode,227 Entering Passive Mode
  8. 1094: 【基础】填词 【循环】
  9. Assuming drive cache: write through ubuntu硬盘内存扩展
  10. 拿下多家主机厂数百万前装定点,禾赛科技激光雷达量产进程加速