二:判斷網(wǎng)絡(luò)連接狀態(tài)
問(wèn)題描述:開始的時(shí)候使用AFNetworking的AFNetworkReachabilityManager判斷網(wǎng)絡(luò)卻發(fā)現(xiàn)一直都是unKnow,總結(jié)一下現(xiàn)在我知道的幾種判斷網(wǎng)絡(luò)的方法
一:使用AFNetworking的AFNetworkReachabilityManager,在APP啟動(dòng)的時(shí)候掉用方法弓叛,之后每次手機(jī)網(wǎng)絡(luò)發(fā)生變化就會(huì)走block鹦牛,PREFERENCES_INSTANCE.netStatus是我設(shè)置的一個(gè)手機(jī)全局變量秉扑,此方法與下面說(shuō)的Reachability的異步監(jiān)聽(tīng)一樣的杏瞻,個(gè)人感覺(jué)AFN的這個(gè)方法適用block使代碼更緊湊會(huì)比較好用一些
+ (void)reachabilityNetStatus {
BOOL isFirst = YES;
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 提示:要監(jiān)控網(wǎng)絡(luò)連接狀態(tài)癌压,必須要先調(diào)用單例的startMonitoring方法
[manager startMonitoring];
__block typeof(isFirst) blockIsFirst = isFirst;
//檢測(cè)的結(jié)果
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
CBCCNetStatus netStatus;
if (status == AFNetworkReachabilityStatusNotReachable) {
netStatus = CBCCNetStatus_None;
NSLog(@"網(wǎng)絡(luò)連接有問(wèn)題");
[[CBCCGlobalConfig shareInstance].globalHUD showToastWithText:@"網(wǎng)絡(luò)連接有問(wèn)題"];
}else if (status == AFNetworkReachabilityStatusReachableViaWWAN) {
netStatus = CBCCNetStatus_GPRS;
NSLog(@"正在使用移動(dòng)網(wǎng)絡(luò)");
[[CBCCGlobalConfig shareInstance].globalHUD showToastWithText:@"正在使用移動(dòng)網(wǎng)絡(luò)"];
}else if (status == AFNetworkReachabilityStatusReachableViaWiFi) {
netStatus = CBCCNetStatus_WiFi;
if (!blockIsFirst) {
NSLog(@"WIFI連接成功");
[[CBCCGlobalConfig shareInstance].globalHUD showToastWithText:@"WIFI連接成功"];
}
}else {
netStatus = CBCCNetStatus_UnKonw;
NSLog(@"誰(shuí)知道用的什么網(wǎng)絡(luò)");
[[CBCCGlobalConfig shareInstance].globalHUD showToastWithText:@"誰(shuí)知道用的什么網(wǎng)絡(luò)"];
}
PREFERENCES_INSTANCE.netStatus = netStatus;
blockIsFirst = NO;
}];
}
二:使用Reachability蛹批,
Reachability類:
1.這個(gè)類用于檢測(cè)當(dāng)前網(wǎng)絡(luò)狀態(tài)撰洗,它不是SDK的一部分,可以在iOS Developer Library里找到這份代碼腐芍。
從蘋果網(wǎng)站上下載Reachability.zip文件差导,解壓。
2.重用Reachability類
(1)把Reachability.h和Reachability.m文件拖到項(xiàng)目中猪勇。
(2)添加框架:SystemConfiguration.framework设褐。
3.監(jiān)測(cè)網(wǎng)絡(luò)變化
- 同步監(jiān)測(cè)網(wǎng)絡(luò):什么時(shí)候用什么時(shí)候判斷不會(huì)實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)變化
//方式一:
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reach currentReachabilityStatus];
//方式二:
Reachability *reach = [Reachability reachabilityWithHostName:@“www.apple.com”];
NetworkStatus status = [reach currentReachabilityStatus];
- 異步的Reachability
(1)異步的方式稍微復(fù)雜,不過(guò)通過(guò)這種方式可以來(lái)訂閱實(shí)時(shí)的網(wǎng)絡(luò)狀態(tài)變化通知泣刹。導(dǎo)入Reachability.h頭文件助析,然后注冊(cè)一個(gè)對(duì)象來(lái)訂閱網(wǎng)絡(luò)狀態(tài)變化的信息,網(wǎng)絡(luò)狀態(tài)變化的信息名稱為kReachabilityChanged-Notification.如下:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:
name:kReachabilityChangedNotification
object:nil];
(2)你需要?jiǎng)?chuàng)建一個(gè)Reachability對(duì)象實(shí)例并開始向外發(fā)布網(wǎng)絡(luò)狀態(tài)變化的消息:
Reachability *reach = [[Reachability reachabilityWithHostName:@“www.apple.com”] retain];
[reach startNotifier];
(3)當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化的時(shí)候椅您,Reachability對(duì)象將調(diào)用reachabilityChanged:方法外冀,可以在這個(gè)方法里面獲取當(dāng)前的網(wǎng)絡(luò)狀態(tài),然后做相應(yīng)的處理襟沮。
- (void)reachabilityChanged:(NSNotification *)notification{
Reachability *reach = [notification object];
if([reach isKindOfClass:[Reachability class]]){
NetworkStatus status = [reach currentReachabilityStatus];
//Insert your code here
}
}
三:?jiǎn)栴}
但事實(shí)上锥惋,基于此方案的所有實(shí)現(xiàn)昌腰,都無(wú)法幫助我們檢測(cè)真正的網(wǎng)絡(luò)連接狀態(tài),它們能檢測(cè)的只是本地連接狀態(tài)膀跌;這種情況包括但不限于如下場(chǎng)景: 1.現(xiàn)在很流行的公用wifi遭商,需要網(wǎng)頁(yè)鑒權(quán),鑒權(quán)之前無(wú)法上網(wǎng)捅伤,但本地連接已經(jīng)建立劫流; 2.存在了本地網(wǎng)絡(luò)連接,但信號(hào)很差丛忆,實(shí)際無(wú)法連接到服務(wù)器祠汇; 3.iOS連接的路由設(shè)備本身沒(méi)有連接外網(wǎng)。
關(guān)于此問(wèn)題熄诡,個(gè)人還沒(méi)有具體看可很,應(yīng)該是要通過(guò)ping來(lái)判斷,具體的實(shí)現(xiàn)方式有一個(gè)RealReachability的第三方感覺(jué)應(yīng)該挺好用凰浮,有需要的可以去研究github地址: https://github.com/dustturtle/RealReachability