您好,登錄后才能下訂單哦!
相信大家都有過類似的需求,需要判斷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)一下。
免責(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)容。