方法一:通過一些網絡類框架
如常用的AFNetworking中有一個Reachability的類,可以檢測當前的網絡狀態(tài)
+ (void)getNetworkStates {
// 監(jiān)控網絡狀態(tài)
AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager sharedManager];
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"狀態(tài)不知道");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"沒網絡");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"流量");
break;
default:
break;
}
}];
//開始監(jiān)控
[reachability startMonitoring];
}
方法二:自己去獲取網絡情況(不通過第三方)
這里說一下思路:主要是獲取程序的狀態(tài)欄狀態(tài)
由于很多的成員變量都是類私有的,都是通過了runtime去獲取的刁赖,所以先寫了個方法去通過runtime獲取一些類的屬性列表
/**
* 通過一個類的名稱獲取一個類的成員變量列表
* @param className 類的名稱
*/
- (void)getIvarListByClassName:(NSString *)className {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList(NSClassFromString(className), &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *objcName = [NSString stringWithUTF8String:name];
NSLog(@"%d : %@", i, objcName);
}
}
這樣可以傳入UIApplication看到有一個成員變量_statusBar
然后可以傳入UIStatusBar看到有一個成員變量_foregroundView
最后從_foregroundView的子視圖上找到對應信息
...
最后就可以通過以下的代碼獲取網絡狀態(tài)了
+ (NSString *)getNetworkStates {
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
NSString *state = [[NSString alloc] init];
int netType = 0;
for (id child in children) {
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
netType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
switch (netType) {
case 0:
state = @"無網絡";
break;
case 1:
state = @"2G";
break;
case 2:
state = @"3G";
break;
case 3:
state = @"4G";
break;
case 5:
state = @"WIFI";
break;
default:
break;
}
}
}
return state;
}