iPhone X獲取設(shè)備的網(wǎng)絡(luò)狀態(tài)

因為iOS的系統(tǒng)是封閉的,所以是沒有直接的APi去獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài)。但是道高一尺痛单,魔高一尺。開發(fā)者總會有辦法獲取自己想要的東西劲腿。


1.一般設(shè)備下的網(wǎng)絡(luò)狀態(tài)獲取

獲取當(dāng)前的網(wǎng)絡(luò)類型

獲取當(dāng)前的網(wǎng)絡(luò)類型是通過獲取狀態(tài)欄旭绒,然后遍歷狀態(tài)欄的視圖完成的。

先導(dǎo)入頭文件,如下:

#import"AppDelegate.h"

實現(xiàn)方法如下:

+?(NSString?*)getNetworkType

{

????UIApplication?*app?=?[UIApplication?sharedApplication];

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

????NSString?*network?=?@"";

????for(id?subview?insubviews)?{

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

????????????intnetworkType?=?[[subview?valueForKeyPath:@"dataNetworkType"]?intValue];

????????????switch(networkType)?{

????????????????case0:

????????????????????network?=?@"NONE";

????????????????????break;

????????????????case1:

????????????????????network?=?@"2G";

????????????????????break;

????????????????case2:

????????????????????network?=?@"3G";

????????????????????break;

????????????????case3:

????????????????????network?=?@"4G";

????????????????????break;

????????????????case5:

????????????????????network?=?@"WIFI";

????????????????????break;

????????????????default:

????????????????????break;

????????????}

????????}

????}

????if([network?isEqualToString:@""])?{

????????network?=?@"NO?DISPLAY";

????}

????returnnetwork;

}

獲取當(dāng)前的Wifi信息

獲取當(dāng)前的Wifi信息需要借助系統(tǒng)的SystemConfiguration這個庫快压。

先導(dǎo)入頭文件,如下:

1#import

實現(xiàn)方法如下:

#pragma?mark?獲取Wifi信息

+?(id)fetchSSIDInfo

{

????NSArray?*ifs?=?(__bridge_transfer?id)CNCopySupportedInterfaces();

????id?info?=?nil;

????for(NSString?*ifnam?inifs)?{

????????info?=?(__bridge_transfer?id)CNCopyCurrentNetworkInfo((__bridge?CFStringRef)ifnam);


????????if(info?&&?[info?count])?{

????????????break;

????????}

????}

????returninfo;

}

#pragma?mark?獲取WIFI名字

+?(NSString?*)getWifiSSID

{

????return(NSString?*)[self?fetchSSIDInfo][@"SSID"];

}

#pragma?mark?獲取WIFI的MAC地址

+?(NSString?*)getWifiBSSID

{

????return(NSString?*)[self?fetchSSIDInfo][@"BSSID"];

}

獲取當(dāng)前的Wifi信號強(qiáng)度

獲取信號強(qiáng)度與獲取網(wǎng)絡(luò)狀態(tài)有點類似垃瞧,通過遍歷狀態(tài)欄蔫劣,從而獲取WIFI圖標(biāo)的信號強(qiáng)度。在獲取前需注意當(dāng)前狀態(tài)是否為WIFI个从。如下:

+?(int)getWifiSignalStrength{


????intsignalStrength?=?0;

//????判斷類型是否為WIFI

????if([[self?getNetworkType]isEqualToString:@"WIFI"])?{

????UIApplication?*app?=?[UIApplication?sharedApplication];

????id?statusBar?=?[app?valueForKey:@"statusBar"];

????UIView?*foregroundView?=?[statusBar?valueForKey:@"foregroundView"];


????NSArray?*subviews?=?[foregroundView?subviews];

????NSString?*dataNetworkItemView?=?nil;


????for(id?subview?insubviews)?{

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

????????????dataNetworkItemView?=?subview;

????????????break;

????????}

????}


????intsignalStrength?=?[[dataNetworkItemView?valueForKey:@"_wifiStrengthBars"]?intValue];

????}

????returnsignalStrength;

}


2.iPhone X下的網(wǎng)絡(luò)狀態(tài)獲取

在iPhone X下,小編尋找資料脉幢,找了一圈都沒有發(fā)現(xiàn)可以使小編滿意的答案,只找到了一個開源類Reachability嗦锐,這個類可以獲取iPhone X下的網(wǎng)絡(luò)狀態(tài)嫌松,當(dāng)然普通設(shè)備也可以用。但是在之后奕污,小編根據(jù)結(jié)構(gòu)萎羔,一步步尋找,終于找到自己想要的東西碳默。

Reachability的使用

下載開源類Reachability贾陷,然后根據(jù)文檔使用即可(該類把移動網(wǎng)絡(luò)統(tǒng)稱為WWAN):

+?(NSString?*)getNetworkTypeByReachability

{

????NSString?*network?=?@"";

????switch([[Reachability?reachabilityForInternetConnection]currentReachabilityStatus])?{

????????caseNotReachable:

????????????network?=?@"NONE";

????????????break;

????????caseReachableViaWiFi:

????????????network?=?@"WIFI";

????????????break;

????????caseReachableViaWWAN:

????????????network?=?@"WWAN";

????????????break;

????????default:

????????????break;

????}

????if([network?isEqualToString:@""])?{

????????network?=?@"NO?DISPLAY";

????}

????returnnetwork;

}

通過結(jié)構(gòu)獲取網(wǎng)絡(luò)類型

在研究這部分之前,小編在想嘱根,為什么在其他設(shè)備可以通過遍歷狀態(tài)欄發(fā)現(xiàn)網(wǎng)絡(luò)狀態(tài)髓废,但是在iPhone X不行。通過打斷點一步步摸索發(fā)現(xiàn)该抒,iPhone X的狀態(tài)欄的結(jié)果和其他設(shè)備不太一樣慌洪。在分級上復(fù)雜了許多,而且移動網(wǎng)絡(luò)和WIFI竟然是調(diào)用了兩個完全不太的類凑保。如下:


這讓小編感覺到了冈爹。。愉适。(自行腦補(bǔ))犯助,在不斷的探索下,終于完成了在上面的基礎(chǔ)適配iPhone X的網(wǎng)絡(luò)類型獲取维咸。

首先剂买,通過添加宏判斷是否是iPhone X,如下:

#define?KIsiPhoneX?([UIScreen?instancesRespondToSelector:@selector(currentMode)]???CGSizeEqualToSize(CGSizeMake(1125,?2436),?[[UIScreen?mainScreen]?currentMode].size)?:?NO)

然后通過層級結(jié)構(gòu)判斷類型,如下:

+?(NSString?*)getNetworkType

{

????UIApplication?*app?=?[UIApplication?sharedApplication];

????id?statusBar?=?[app?valueForKeyPath:@"statusBar"];

????NSString?*network?=?@"";


????if(KIsiPhoneX)?{

//????????iPhone?X

????????id?statusBarView?=?[statusBar?valueForKeyPath:@"statusBar"];

????????UIView?*foregroundView?=?[statusBarView?valueForKeyPath:@"foregroundView"];


????????NSArray?*subviews?=?[[foregroundView?subviews][2]?subviews];


????????for(id?subview?insubviews)?{

????????????if([subview?isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")])?{

????????????????network?=?@"WIFI";

????????????}elseif([subview?isKindOfClass:NSClassFromString(@"_UIStatusBarStringView")])?{

????????????????network?=?[subview?valueForKeyPath:@"originalText"];

????????????}

????????}

????}else{

//????????非?iPhone?X

????????UIView?*foregroundView?=?[statusBar?valueForKeyPath:@"foregroundView"];

????????NSArray?*subviews?=?[foregroundView?subviews];


????????for(id?subview?insubviews)?{

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

????????????????intnetworkType?=?[[subview?valueForKeyPath:@"dataNetworkType"]?intValue];

????????????????switch(networkType)?{

????????????????????case0:

????????????????????????network?=?@"NONE";

????????????????????????break;

????????????????????case1:

????????????????????????network?=?@"2G";

????????????????????????break;

????????????????????case2:

????????????????????????network?=?@"3G";

????????????????????????break;

????????????????????case3:

????????????????????????network?=?@"4G";

????????????????????????break;

????????????????????case5:

????????????????????????network?=?@"WIFI";

????????????????????????break;

????????????????????default:

????????????????????????break;

????????????????}

????????????}

????????}

????}

????if([network?isEqualToString:@""])?{

????????network?=?@"NO?DISPLAY";

????}

????returnnetwork;

}

通過結(jié)構(gòu)獲取WIFI信號強(qiáng)度

因為上面獲取SSID和BSSID的方法在iPhone X依然可用癌蓖,因此就不多加說明了瞬哼,獲取iPhone X信號強(qiáng)度的方法也類似于上方獲取類型。首先判斷是否屬于WIFI網(wǎng)絡(luò)租副,然后根據(jù)iPhone X特有的結(jié)構(gòu)找到特定的地方獲取值就行坐慰,如下:

#pragma?mark?獲取Wifi信號強(qiáng)度

+?(int)getWifiSignalStrength{


????intsignalStrength?=?0;

//????判斷類型是否為WIFI

????if([[self?getNetworkType]isEqualToString:@"WIFI"])?{

????????UIApplication?*app?=?[UIApplication?sharedApplication];

????????id?statusBar?=?[app?valueForKey:@"statusBar"];

????????if(KIsiPhoneX)?{

//????????????iPhone?X

????????????id?statusBarView?=?[statusBar?valueForKeyPath:@"statusBar"];

????????????UIView?*foregroundView?=?[statusBarView?valueForKeyPath:@"foregroundView"];

????????????NSArray?*subviews?=?[[foregroundView?subviews][2]?subviews];


????????????for(id?subview?insubviews)?{

????????????????if([subview?isKindOfClass:NSClassFromString(@"_UIStatusBarWifiSignalView")])?{

????????????????????signalStrength?=?[[subview?valueForKey:@"_numberOfActiveBars"]?intValue];

????????????????}

????????????}

????????}else{

//????????????非?iPhone?X

????????????UIView?*foregroundView?=?[statusBar?valueForKey:@"foregroundView"];


????????????NSArray?*subviews?=?[foregroundView?subviews];

????????????NSString?*dataNetworkItemView?=?nil;


????????????for(id?subview?insubviews)?{

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

????????????????????dataNetworkItemView?=?subview;

????????????????????break;

????????????????}

????????????}


????????????signalStrength?=?[[dataNetworkItemView?valueForKey:@"_wifiStrengthBars"]?intValue];

????????}

????}

????returnsignalStrength;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市用僧,隨后出現(xiàn)的幾起案子结胀,更是在濱河造成了極大的恐慌赞咙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糟港,死亡現(xiàn)場離奇詭異攀操,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秸抚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門速和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剥汤,你說我怎么就攤上這事颠放。” “怎么了吭敢?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵碰凶,是天一觀的道長。 經(jīng)常有香客問我鹿驼,道長痒留,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任蠢沿,我火速辦了婚禮伸头,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舷蟀。我一直安慰自己恤磷,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布野宜。 她就那樣靜靜地躺著扫步,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匈子。 梳的紋絲不亂的頭發(fā)上河胎,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音虎敦,去河邊找鬼游岳。 笑死,一個胖子當(dāng)著我的面吹牛其徙,可吹牛的內(nèi)容都是我干的胚迫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼唾那,長吁一口氣:“原來是場噩夢啊……” “哼访锻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤期犬,失蹤者是張志新(化名)和其女友劉穎河哑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體龟虎,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡灾馒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了遣总。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡轨功,死狀恐怖旭斥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情古涧,我是刑警寧澤垂券,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站羡滑,受9級特大地震影響菇爪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柒昏,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一凳宙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧职祷,春花似錦氏涩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泥耀,卻和暖如春饺汹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痰催。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工兜辞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夸溶。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓弦疮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜘醋。 傳聞我的和親對象是個殘疾皇子胁塞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345