獲取iOS網(wǎng)絡(luò)狀態(tài),我目前知道的有兩種辦法。
方法一:Reachability。
相信大家使用最多的方法就是使用Reachability
這是蘋果的官方演示demo中使用到的方法。
- 1、首先你需要下載并導(dǎo)入Reachability。這是蘋果官方演示demo,把里面的Reachability文件拷貝到自己的工程。下載地址:https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
- 2、導(dǎo)入SystemConfiguration.framework框架。
- 3、分析reachability中的代碼含義,可以看到以下三種網(wǎng)絡(luò)狀態(tài):無(wú)網(wǎng)絡(luò),wifi和蜂窩網(wǎng)。
typedef enum : NSInteger {
NotReachable = 0,//沒(méi)有網(wǎng)絡(luò)
ReachableViaWiFi,//當(dāng)前使用Wifi網(wǎng)絡(luò)
ReachableViaWWAN//使用的蜂窩網(wǎng)絡(luò)
} NetworkStatus;
* 4、獲取網(wǎng)絡(luò)狀態(tài)的代碼
`#pragma mark - 獲取網(wǎng)絡(luò)狀態(tài)
+(NSString *)internetStatus {
Reachability *reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus internetStatus = [reachability currentReachabilityStatus];
NSString *net = @"wifi";
switch (internetStatus) {
case ReachableViaWiFi:
net = @"wifi";
break;
case ReachableViaWWAN:
net = @"wwan";
break;
case NotReachable:
net = @"notReachable";
default:
break;
}
return net;
}
>值得一提的是HostName改成"www.baidu.com"或者其他中國(guó)網(wǎng)站時(shí)經(jīng)常會(huì)獲取網(wǎng)絡(luò)狀態(tài)錯(cuò)誤,不能得到正確的網(wǎng)絡(luò)狀態(tài)。所以最好使用蘋果的網(wǎng)站"www.apple.com"
這種方法是目前最普遍的使用方式,由于是蘋果官方demo,所以比較權(quán)威。但是這種方法的缺點(diǎn)是不能知道用戶使用的手機(jī)網(wǎng)絡(luò)是2G、3G還是4G。
###這樣就有了第二種獲取網(wǎng)絡(luò)狀態(tài)的方法。
#方法二:
>這種方法通過(guò)監(jiān)聽(tīng)手機(jī)的statusbar的狀態(tài)還獲取用戶的網(wǎng)絡(luò)狀態(tài)。可以通過(guò)蘋果的審核在Appstore上架。代碼量非常小,簡(jiǎn)單易懂,最重要的是能區(qū)分2G、3G、4G、LTE。話不多說(shuō),直接上代碼。
-
(NSString *)networkingStatesFromStatebar {
// 狀態(tài)欄是由當(dāng)前app控制的,首先獲取當(dāng)前app
UIApplication *app = [UIApplication sharedApplication];NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int type = 0;
for (id child in children) {
if ([child isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}NSString *stateString = @"wifi";
switch (type) {
case 0:
stateString = @"notReachable";
break;case 1: stateString = @"2G"; break; case 2: stateString = @"3G"; break; case 3: stateString = @"4G"; break; case 4: stateString = @"LTE"; break; case 5: stateString = @"wifi"; break; default: break;
}
return stateString;
>###不過(guò)需要注意的是,使用這種方法時(shí)一定要保證statusbar沒(méi)有隱藏。如果你的App隱藏了statusbar,那么你也就不能通過(guò)這種方法獲得網(wǎng)絡(luò)狀態(tài)。