码迷,mamicode.com
首页 > 移动开发 > 详细

IOS的网络提示(E\2G\3G\4G\WIFI\无网)

时间:2017-02-20 17:34:07      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:文件   scn   inf   via   migration   project   cfs   doc   tde   

1、介绍

            网络提示是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的网络提示(E\2G\3G\4G\WIFI\无网)

标签:文件   scn   inf   via   migration   project   cfs   doc   tde   

原文地址:http://blog.csdn.net/zhoushuangjian511/article/details/56013002

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!