溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iOS平臺(tái)判斷2G,3G,wifi網(wǎng)絡(luò)類型

發(fā)布時(shí)間:2020-07-31 14:42:49 來源:網(wǎng)絡(luò) 閱讀:5944 作者:iKingLai 欄目:移動(dòng)開發(fā)

相信大家都有過類似的需求,需要判斷iOS上面當(dāng)前連接的網(wǎng)絡(luò)是2G,3G還是wifi?大部分的做法是使用reachability這個(gè)類,但是這種做法有一個(gè)致命的缺點(diǎn)就是:無法區(qū)分2G和3G。雖然網(wǎng)上號(hào)稱有人可以準(zhǔn)確的區(qū)分開,但是我自己測試,發(fā)現(xiàn)并非如此。而且reachability這種做法,需要連接到指定的一個(gè)網(wǎng)站,然后采用通知的方式來獲取連接的狀態(tài),由此可見這種做法,既慢又復(fù)雜。下面就介紹一種簡單而又準(zhǔn)確的方法。


首先定義一個(gè)枚舉來代表不同的網(wǎng)絡(luò)類型


typedef enum {

   NETWORK_TYPE_NONE= 0,

   NETWORK_TYPE_WIFI= 1,

   NETWORK_TYPE_3G= 2,

   NETWORK_TYPE_2G= 3,

}NETWORK_TYPE;


然后通過獲取手機(jī)信號(hào)欄上面的網(wǎng)絡(luò)類型的標(biāo)志

+ (int)dataNetworkTypeFromStatusBar {


   UIApplication *app = [UIApplicationsharedApplication];

   NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];

   NSNumber *dataNetworkItemView = nil;


   for (id subview in subviews) {

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

           dataNetworkItemView = subview;

           break;

       }

   }


int netType = NETWORK_TYPE_NONE;

NSNumber * num = [dataNetworkItemView valueForKey:@"dataNetworkType"];

if (num == nil) {


       netType = NETWORK_TYPE_NONE;


   }else{


int n = [num intValue];

if (n == 0) {

           netType = NETWORK_TYPE_NONE;

       }elseif (n == 1){

           netType = NETWORK_TYPE_2G;

       }elseif (n == 2){

           netType = NETWORK_TYPE_3G;

       }else{

           netType = NETWORK_TYPE_WIFI;

       }


   }


return netType;

}


注意:這里用到了私有的API,但是這個(gè)大家不用擔(dān)心,因?yàn)槲业膽?yīng)用已經(jīng)被審核通過了。


經(jīng)過測試,上面的方法是非常簡單有效的,大家不妨自己實(shí)驗(yàn)一下。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI