1. 程式人生 > >IOS的網路提示(E\2G\3G\4G\WIFI\無網)

IOS的網路提示(E\2G\3G\4G\WIFI\無網)

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、效果圖