IOS的网络提示(E\2G\3G\4G\WIFI\无网)
2017-02-20 16:28
603 查看
1、介绍
网络提示是App开发中不可缺少的模块。现在App需求智能化,要求根据网络的变化可以自动做出合理的处理(包括提示、下载...等)。对于网络的处理也非常简单,实现也就几行代码(这是因为,苹果对网络变化进行了整理)。 苹果官方提供一个监控网络变化的文件名字为 Reachability。对于Reachability也有其不足的地方,它不能更详细的判断用户是那种手机网络,只是提供给开发者一个统称的表示。
2、官方 Reachability 的介绍
Reachability(官方)的获取方法是打开Xcode,同事按住 " command + shift + / " 就可以调出这个界面,如下:
![](https://img-blog.csdn.net/20170220150140594?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
点击 Documentation and API Reference 后会出现下面图:
![](https://img-blog.csdn.net/20170220151004722?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在红色(红色是我标记的,其实是没有的)的框内输入 Reachability ,然后会弹出下图:
![](https://img-blog.csdn.net/20170220151345360?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
点击红色框内的 Reachability ,然后弹出下面的图:
![](https://img-blog.csdn.net/20170220151841055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在点击 Open Project ,打开并下载该工程。
3、官方 Reachability 的不足
看官方给出的监控返回类型如下:
![](https://img-blog.csdn.net/20170220152309029?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上图我们可以看到官方,支持的情况。不足在于手机网络模式整合,不能区分2G\3G\4G、E等网络。
4、我们对官方的 Reachability 进行扩展,让其支持 2~4G和E 网络。
1》修改官方返回的网络枚举,如下图:
![](https://img-blog.csdn.net/20170220153328062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
2》添加 #import<CoreTelephony/CTTelephonyNetworkInfo.h>
库,如下图:
![](https://img-blog.csdn.net/20170220153507219?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
3》核心代码更改区,如下图:
5、对无网络的设置处理,做兼容,如下图:
![](https://img-blog.csdn.net/20170220153753502?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
6、完整的Demo下载地址
链接: https://pan.baidu.com/s/1hsysOPe 密码: jz3q
7、效果图
![](https://img-blog.csdn.net/20170220162201115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170220162553211?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170220162609755?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170220162632336?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170220162718149?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXNodWFuZ2ppYW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
网络提示是App开发中不可缺少的模块。现在App需求智能化,要求根据网络的变化可以自动做出合理的处理(包括提示、下载...等)。对于网络的处理也非常简单,实现也就几行代码(这是因为,苹果对网络变化进行了整理)。 苹果官方提供一个监控网络变化的文件名字为 Reachability。对于Reachability也有其不足的地方,它不能更详细的判断用户是那种手机网络,只是提供给开发者一个统称的表示。
2、官方 Reachability 的介绍
Reachability(官方)的获取方法是打开Xcode,同事按住 " command + shift + / " 就可以调出这个界面,如下:
点击 Documentation and API Reference 后会出现下面图:
在红色(红色是我标记的,其实是没有的)的框内输入 Reachability ,然后会弹出下图:
点击红色框内的 Reachability ,然后弹出下面的图:
在点击 Open Project ,打开并下载该工程。
3、官方 Reachability 的不足
看官方给出的监控返回类型如下:
从上图我们可以看到官方,支持的情况。不足在于手机网络模式整合,不能区分2G\3G\4G、E等网络。
4、我们对官方的 Reachability 进行扩展,让其支持 2~4G和E 网络。
1》修改官方返回的网络枚举,如下图:
2》添加 #import<CoreTelephony/CTTelephonyNetworkInfo.h>
库,如下图:
3》核心代码更改区,如下图:
#pragma mark - Network Flag Handling - (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags { PrintReachabilityFlags(flags, "networkStatusForFlags"); if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // The target host is not reachable. return NotReachable; } NetworkStatus returnValue = NotReachable; 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 = ReachableViaWiFi; } 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 = ReachableViaWiFi; } } if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) { /* ... but WWAN connections are OK if the calling application is using the CFNetwork APIs. */ /*! 版本兼容 */ float systemVersion = [UIDevice currentDevice].systemVersion.floatValue; if (systemVersion>=7.0) { CTTelephonyNetworkInfo * telephonyNetwork = [CTTelephonyNetworkInfo new]; /*! 获取当前网络的名字 */ NSString * NetworkNameString = [telephonyNetwork currentRadioAccessTechnology]; if (NetworkNameString) { /*! 网络区分 CTRadioAccessTechnologyGPRS - 2G CTRadioAccessTechnologyEdge - 2G (sometimes called 2.5G) CTRadioAccessTechnologyWCDMA - 3G CTRadioAccessTechnologyHSDPA - 3G (sometimes called 3.5G) CTRadioAccessTechnologyHSUPA - 3G CTRadioAccessTechnologyCDMA1x - 2G CTRadioAccessTechnologyCDMAEVDORev0 - 3G CTRadioAccessTechnologyCDMAEVDORevA - 3G CTRadioAccessTechnologyCDMAEVDORevB - 3G CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE) CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above) */ if ([NetworkNameString isEqualToString:CTRadioAccessTechnologyGPRS]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyEdge]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyCDMA1x]) { returnValue = ReachableVia2G; }else if ([NetworkNameString isEqualToString:CTRadioAccessTechnologyWCDMA]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyHSDPA]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyHSUPA]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyHSUPA]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]||[NetworkNameString isEqualToString:CTRadioAccessTechnologyeHRPD]){ returnValue = ReachableVia3G; }else if ([NetworkNameString isEqualToString:CTRadioAccessTechnologyLTE]){ returnValue = ReachableVia4G; }else{ returnValue = ReachableViaWWAN; } }else{ returnValue = ReachableViaWWAN; } }else{ /*! 低版本 */ returnValue = ReachableViaWWAN; } } return returnValue; }
5、对无网络的设置处理,做兼容,如下图:
6、完整的Demo下载地址
链接: https://pan.baidu.com/s/1hsysOPe 密码: jz3q
7、效果图
相关文章推荐
- iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
- iOS 网络断开的提示实现
- ios检测网络,无网络提示并直接进入设置页面
- iOS开发中,对于列表无数据、无网络展示的友好提示
- react native 执行fetch在安卓没问题,ios上却提示网络请求失败?
- iOS-网络-NSURLSessionDataTask实现大文件下载,进度提示
- iOS 检测网络状态 自动判断 认为提示网络改变
- ios(学习)info.plist与application一点小的总结(application设置网络状态以及提示消息数等)
- iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)
- 加入域时提示“找不到网络路径”
- WINDOWS SERVER 2003从入门到精通之“加入域提示找不到网络路径活动目录缺少dns记录”
- 解析思科网络设备IOS的操作顺序
- CCNA学习笔记---第4章:IOS介绍(网络操作系统)
- 局域网共享问题,提示:无法访问.你可能没有权限使用网络资源
- OK,搞定VLSM以及CIDR,朝着IOS进发还有对初学网络的同仁的勉励
- 关于SQL SERVER 2000 提示"一般性网络错误" 的解决方法
- Cisco的互联网络操作系统IOS的基本命令汇总
- 网络中共享打印机,打印报错提示SPOOLSV服务出错!
- 加域时提示找不到网络路径
- 访问网络资源提示网络不存在或者尚未启动的问题