相信大家都有過類似的需求,需要判斷iOS上面當前連接的網絡是2G,3G還是wifi?大部分的做法是使用reachability這個類,但是這種做法有一個致命的缺點就是:無法區分2G和3G。雖然網上號稱有人可以準確的區分開,但是我自己測試,發現并非如此。而且reachability這種做法,需要連接到指定的一個網站,然后采用通知的方式來獲取連接的狀態,由此可見這種做法,既慢又復雜。下面就介紹一種簡單而又準確的方法。
首先定義一個枚舉來代表不同的網絡類型
typedef enum {
NETWORK_TYPE_NONE= 0,
NETWORK_TYPE_WIFI= 1,
NETWORK_TYPE_3G= 2,
NETWORK_TYPE_2G= 3,
}NETWORK_TYPE;
然后通過獲取手機信號欄上面的網絡類型的標志
+ (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,但是這個大家不用擔心,因為我的應用已經被審核通過了。
經過測試,上面的方法是非常簡單有效的,大家不妨自己實驗一下。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。