判斷當(dāng)前網(wǎng)絡(luò)狀態(tài) - iOS

在目前項(xiàng)目中,為了更好的用戶體驗(yàn)搞疗,有些場(chǎng)景下首先需要進(jìn)行當(dāng)前網(wǎng)絡(luò)狀態(tài)的判斷后,再執(zhí)行后續(xù)流程须肆。

例如:下載匿乃、音頻、視頻的播放等相關(guān)的一些操作前豌汇,首先需要對(duì)當(dāng)前用戶網(wǎng)絡(luò)環(huán)境進(jìn)行判斷幢炸,是 WiFi 還是 4G 等。

WiFi則可以繼續(xù)執(zhí)行后續(xù)操作流程拒贱,如果當(dāng)前網(wǎng)絡(luò)處于 4G 的情況下宛徊,需要使用流量才可執(zhí)行后續(xù)操作佛嬉,則應(yīng)提醒用戶是否執(zhí)行后續(xù)操作的提示,使得用戶體驗(yàn)效果更佳闸天。

一般常用獲取網(wǎng)絡(luò)狀態(tài)的方式如下:

一暖呕、Reachability

首先,蘋果官方提供了演示的 demo 中所用到的方法(飛機(jī)票:ReachabilityDemo)苞氮;

其次湾揽,將 demo 中 Reachability 的類導(dǎo)入至工程,并在 Build Phases -> Link Binary 中添加 SystemConfiguration.framework 框架笼吟;

最后库物,在需要使用的地方引入 Reachability 的頭文件并調(diào)用類中所提供的接口方法即可。

在 Reachability 頭文件中可得知網(wǎng)絡(luò)狀態(tài)的枚舉值贷帮,如下所示:

typedef enum : NSInteger {

   NotReachable = 0,

   ReachableViaWiFi,

   ReachableViaWWAN

} NetworkStatus

獲取網(wǎng)絡(luò)狀態(tài)方法一:

#pragma mark - 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)

/**

*  獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)

*

*  0:無(wú)網(wǎng)絡(luò) & 1:2G & 2:3G & 3:4G & 5:WIFI

*/

- (NSInteger)getCurrentNetworkState {

   NSString *netWorkState = [[AFNetworkReachabilityManager sharedManager] localizedNetworkReachabilityStatusString];

   /*

    AFNetworkReachabilityStatusUnknown          = -1,

    AFNetworkReachabilityStatusNotReachable     = 0,

    AFNetworkReachabilityStatusReachableViaWWAN = 1,

    AFNetworkReachabilityStatusReachableViaWiFi = 2,

    */

   NSLog(@"NewWorkState --- %@", netWorkState);



   if ([netWorkState isEqualToString:@"Unknow"] || [netWorkState isEqualToString:@"Not Reachable"]) {// 未知 或 無(wú)網(wǎng)絡(luò)

       return 0;

   }

   else if ([netWorkState isEqualToString:@"Reachable via WWAN"]) {// 蜂窩數(shù)據(jù)

       return 1;

   }

   else {// WiFi

       return 2;

   }

}

注:在 iOS7 之前戚揭,當(dāng)用戶網(wǎng)絡(luò)為蜂窩網(wǎng)絡(luò)時(shí),無(wú)法判斷 3G皿桑、4G 等網(wǎng)絡(luò)類型毫目,而在 iOS7 后則可以進(jìn)行該項(xiàng)判斷操作。

方法二:

- (NSString *)internetStatus {

   Reachability *reachability   = [Reachability reachabilityWithHostName:@"www.apple.com"];

   NetworkStatus internetStatus = [reachability currentReachabilityStatus];

   NSString *net = @"WIFI";

   switch (internetStatus) {

       case ReachableViaWiFi:

           net = @"WIFI";

           break;

       case ReachableViaWWAN:

           net = @"蜂窩數(shù)據(jù)";

//            net = [self getNetType ];   //判斷具體類型

           break;

       case NotReachable:

           net = @"當(dāng)前無(wú)網(wǎng)路連接";

       default:

           break;

   }

   return net;

}

此時(shí)可以使用自帶的 API 進(jìn)行判斷是 2G诲侮、3G镀虐、4G,但需要使用到CTTelephonyNetworkInfo 類沟绪。

當(dāng)用戶手機(jī)為自帶網(wǎng)絡(luò)時(shí)刮便,判斷具體網(wǎng)絡(luò)類型;

首先绽慈,需要在工程中添加 CoreTelephony.framework 框架恨旱;

其次,引入該類頭文件坝疼。

- (NSString *)getNetType {

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

   NSString *currentStatus = info.currentRadioAccessTechnology;

   if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyGPRS"]) {

       netconnType = @"GPRS";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyEdge"]) {

       netconnType = @"2.75G EDGE";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyWCDMA"]){

       netconnType = @"3G";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSDPA"]){

       netconnType = @"3.5G HSDPA";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyHSUPA"]){

       netconnType = @"3.5G HSUPA";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMA1x"]){

       netconnType = @"2G";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORev0"]){

       netconnType = @"3G";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevA"]){

       netconnType = @"3G";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyCDMAEVDORevB"]){

       netconnType = @"3G";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyeHRPD"]){

       netconnType = @"HRPD";

   }else if ([currentStatus isEqualToString:@"CTRadioAccessTechnologyLTE"]){

       netconnType = @"4G";

   }

}

使此方法判斷蜂窩網(wǎng)絡(luò)類型搜贤,如下

CTRadioAccessTechnologyGPRS         //介于2G和3G之間,也叫2.5G ,過(guò)度技術(shù)

CTRadioAccessTechnologyEdge         //EDGE為GPRS到第三代移動(dòng)通信的過(guò)渡钝凶,EDGE俗稱2.75G

CTRadioAccessTechnologyWCDMA

CTRadioAccessTechnologyHSDPA            //亦稱為3.5G(3?G)

CTRadioAccessTechnologyHSUPA            //3G到4G的過(guò)度技術(shù)

CTRadioAccessTechnologyCDMA1x       //3G

CTRadioAccessTechnologyCDMAEVDORev0    //3G標(biāo)準(zhǔn)

CTRadioAccessTechnologyCDMAEVDORevA

CTRadioAccessTechnologyCDMAEVDORevB

CTRadioAccessTechnologyeHRPD        //電信使用的一種3G到4G的演進(jìn)技術(shù)仪芒, 3.75G

CTRadioAccessTechnologyLTE          //接近4G

二、通過(guò) statusBar 判斷

注:該方法在 iPhoneX 中運(yùn)行程序會(huì)導(dǎo)致程序 crash耕陷!初步判斷為蘋果官方將 statusBar 的 keyPath 內(nèi)參數(shù)變更所引起獲取數(shù)據(jù)結(jié)果集為 nil掂名,最終導(dǎo)致程序的 crash!坑坝茨=让铩!嗜诀!

#pragma mark - 獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)

/**

*  獲取當(dāng)前網(wǎng)絡(luò)狀態(tài)

*

*  0:無(wú)網(wǎng)絡(luò) & 1:2G & 2:3G & 3:4G & 5:WIFI

*/

- (NSInteger)getCurrentNetworkState {  

   int type = 0;

   NSArray *children = [[[kApplication valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];

   for (id child in children) {

       if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {

           type = [[child valueForKeyPath:@"dataNetworkType"] intValue];

       }

   }

   return type;

} 

三猾警、通過(guò)第三方 AFNetworking
此方法通常使用在 AppDelegate 中孔祸,每當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生改變時(shí)便會(huì)發(fā)送當(dāng)前變更狀態(tài),起到了實(shí)時(shí)監(jiān)控當(dāng)前網(wǎng)絡(luò)狀態(tài)變化的監(jiān)控操作肿嘲,有利于及時(shí)處理相關(guān)操作融击。

#pragma mark - ****************************** 網(wǎng)絡(luò)環(huán)境監(jiān)聽
/**
 網(wǎng)絡(luò)環(huán)境監(jiān)聽

 方法中基于 MBProgressHUD 的方法詳見類方法中筑公,GitHub 鏈接如下 
 (https://github.com/survivorsfyh/YHTools/blob/master/MBProgressHUD%2BYH.h)
 (https://github.com/survivorsfyh/YHTools/blob/master/MBProgressHUD%2BYH.m)

 */
- (void)AFNReachability {
    // 創(chuàng)建網(wǎng)絡(luò)監(jiān)聽管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    // 監(jiān)聽網(wǎng)絡(luò)狀態(tài)
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知");
                [MBProgressHUD showCommonHudWithAlertString:@"未知"
                                                 afterDelay:2.0
                                                     toView:self.window];
                
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"暫無(wú)網(wǎng)絡(luò)");
                [MBProgressHUD showCommonHudWithAlertString:@"暫無(wú)網(wǎng)絡(luò)"
                                                 afterDelay:2.0
                                                     toView:self.window];
                
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"4G");
                [MBProgressHUD showCommonHudWithAlertString:@"4G"
                                                 afterDelay:2.0
                                                     toView:self.window];
                
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WIFI");
                [MBProgressHUD showCommonHudWithAlertString:@"WiFi"
                                                 afterDelay:2.0
                                                     toView:self.window];
                
                break;
                
            default:
                break;
        }

        if (status != AFNetworkReachabilityStatusNotReachable && !kStringIsEmpty([UserTableOperation getCurrentUserWithToken])) {// 有網(wǎng)了的情況下通知 bookShelf 檢測(cè) banner 是否存在
            [kNotificationCenter postNotificationName:@"NoticeBookShelfCheckBanner" object:nil];
        }
        
    }];
    
    // 開啟監(jiān)測(cè)
    [manager startMonitoring];
}

注:方法三中 MBProgressHUD 的方法詳見 GitHub雳窟,鏈接如下:
聲明:GitHub 聲明類
實(shí)現(xiàn):GitHub 實(shí)現(xiàn)類


以上為此次分享的內(nèi)容,尤其方法二請(qǐng)慎用匣屡,真的坑封救!如有什么不周之處還請(qǐng)多多指點(diǎn),謝謝捣作!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末誉结,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子券躁,更是在濱河造成了極大的恐慌惩坑,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件也拜,死亡現(xiàn)場(chǎng)離奇詭異以舒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)慢哈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蔓钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卵贱,你說(shuō)我怎么就攤上這事滥沫。” “怎么了键俱?”我有些...
    開封第一講書人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵兰绣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我编振,道長(zhǎng)缀辩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任党觅,我火速辦了婚禮雌澄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杯瞻。我一直安慰自己镐牺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開白布魁莉。 她就那樣靜靜地躺著睬涧,像睡著了一般募胃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畦浓,一...
    開封第一講書人閱讀 50,043評(píng)論 1 291
  • 那天痹束,我揣著相機(jī)與錄音,去河邊找鬼讶请。 笑死祷嘶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夺溢。 我是一名探鬼主播论巍,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼风响!你這毒婦竟也來(lái)了嘉汰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤状勤,失蹤者是張志新(化名)和其女友劉穎鞋怀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體持搜,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡密似,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朵诫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛友。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖剪返,靈堂內(nèi)的尸體忽然破棺而出废累,到底是詐尸還是另有隱情,我是刑警寧澤脱盲,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布邑滨,位于F島的核電站,受9級(jí)特大地震影響钱反,放射性物質(zhì)發(fā)生泄漏掖看。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一面哥、第九天 我趴在偏房一處隱蔽的房頂上張望哎壳。 院中可真熱鬧,春花似錦尚卫、人聲如沸归榕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刹泄。三九已至外里,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間特石,已是汗流浹背盅蝗。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姆蘸,地道東北人墩莫。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乞旦,于是被迫代替她去往敵國(guó)和親贼穆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 洗碗 今天晚上兰粉,我們一家人一起吃了晚飯后,我發(fā)現(xiàn)奶奶太累了顶瞳,于是我就去對(duì)奶奶說(shuō):“奶...
    小太陽(yáng)n閱讀 181評(píng)論 0 0
  • 今天我要做最美的新娘玖姑!要把所有的頭發(fā)都盤起來(lái),露出修長(zhǎng)的脖子慨菱,要穿那件繡滿金片的大紅長(zhǎng)裙焰络,蹬那雙十公分的大高跟鞋,...
    萍_c5dc閱讀 139評(píng)論 0 0
  • 朝陽(yáng)照萬(wàn)息 皎月行千古 浪擊三千 濤濤東流 江河日下 百載一晃 你來(lái)我往一過(guò)去 花開葉落一春秋 留不住 戀不得 奈...
    水墨悠然閱讀 337評(píng)論 8 13