方法一:通过一些网络类框架
如常用的AFNetworking中有一个Reachability的类,可以检测当前的网络状态
+ (void)getNetworkStates {
// 监控网络状态
AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager sharedManager];
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"状态不知道");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没网络");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"流量");
break;
default:
break;
}
}];
//开始监控
[reachability startMonitoring];
}
方法二:自己去获取网络情况(不通过第三方)
这里说一下思路:主要是获取程序的状态栏状态
由于很多的成员变量都是类私有的,都是通过了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的子视图上找到对应信息
...
最后就可以通过以下的代码获取网络状态了
+ (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;
}
网友评论