runtime获取网络状态
首先导入头文件:
#import <objc/message.h>
实现如下代码判断:
// 状态栏是由当前控制器控制的,首先获取当前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")] {
type = [[child valueForKeyPath:@"dataNetworkType"] intValue];
}
}
// type数字对应的网络状态依次是:0:无网络;1:2G网络;2:3G网络;3:4G网络;5:WIFI信号
NSLog(@"type is '%d'.", type);
tips:此方法通过真机调试,只对真机有效,模拟器由于始终Wi-Fi在线,因此不能准确获取模拟器当前网络状态。
系统方法
第1步:添加
SystemConfiguration
库;选中
Target
,进入工程配置界面 -> 选择Build Phases
->选择Link Binary With Libraries
-> 点击+
->输入SystemConfiguration.framework
->点击Add
第2步:导入框架
#import <CommonCrypto/CommonHMAC.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <netdb.h>
#import <arpa/inet.h>
- 第3步:声明网络判断方法
- (BOOL)connectedToNetwork;
- 第4步:实现网络判断方法
- (BOOL)connectedToNetwork {
// 创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
// SCNetworkReachabilityCreateWithAddress:根据传入的IP地址测试连接状态,当为0.0.0.0时则可以查询本机的网络连接状态。
// 使用SCNetworkReachabilityCreateWithAddress:可以根据传入的网址地址测试连接状态
// Recover reachability flags
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flags\n");
return NO;
}
// kSCNetworkReachabilityFlagsReachable:能够连接网络
// kSCNetworkReachabilityFlagsConnectionRequired:能够连接网络,但是首先得建立连接过程
// kSCNetworkReachabilityFlagsIsWWAN:判断是否通过蜂窝网覆盖的连接
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}
- 第5步:调用方法
if (![self connectedToNetwork]) {
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"温馨提示"
message:@"网络连接失败,请检查网络"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil, nil];
[alert show];
}else{
// 有网操作;
}