最近做一个项目,里面要用到网络监听,感觉好难,早上查了一早上的资料,网上的帖子大都差不多。
看了看,最后整理合并了一下,感觉这个用起来最实在,也最简单。
检测网络状态
让用户了解自己的网络状态,防止一些错误操作
根据用户的网络状态进行智能处理,节省用户流量,提高用户体验
WIFI/3G网络:自动下载高清图片
低俗网络:只下载缩略图
没有网络:只显示离线的缓存数据
添加框架:SystemConfiguration.framework
在网络应用中,需要对用户设备的网络状态进行实时监控,
苹果官方提供了一个叫Reachability的实例程序,便于开发者检测网络状态
Reachablibity的使用步骤
1:导入头文件
#import "Reachability.h"
2:注册网络监听
// 监听网络状态发生改变的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];
// 获得Reachability对象
self.reachability = [Reachability reachabilityForInternetConnection];
// 开始监控网络
[self.reachability startNotifier];
添加到:AppDelegate.h 中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
}
3:实在通知中的代理方法:networkStateChange
-(void)networkStateChange{
NSLog(@"网络状态改变了");
if ([AppDelegate isEnableWIFI]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"wifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
[alert show];
} else if ([AppDelegate isEnable3G]) {
if ([[[NSUserDefaults standardUserDefaults]objectForKey:@"wifiSwitch"]isEqualToString:@"on"]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"3GMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"fou", nil) otherButtonTitles:NSLocalizedString(@"shi", nil), nil];
alert.tag = 1;
[alert show];
}
} else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"wenxintishi", nil) message:NSLocalizedString(@"noWifiMessage", nil) delegate:self cancelButtonTitle:NSLocalizedString(@"queding", nil) otherButtonTitles:nil, nil];
[alert show];
}
}
********这个里面,其实就三种状态:3g,没网,wifi,我在这里是各自给了一个弹框;
// 是否WIFI
+ (BOOL)isEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否3G
+ (BOOL)isEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
其实,现在网络状态远远不止3g一种,有人用2G、有人用3G,还有人用4G、5G也快出来了吧。所以只返回一个3G值显然并不满足我们程序的需要;
因为 #import "Reachability.h" 中并没有提供那么多得返回值供我们使用,我在网上查了一下,针对这个问题,好多大牛们已然有了解决方法。
5:修改 Reachability 检测的2G/3G/4G/5G网络
在networkStatusForFlags:方法里面找到以下的地方,替换就OK;
if (flags & kSCNetworkReachabilityFlagsIsWWAN) {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentRadioAccessTechnology = info.currentRadioAccessTechnology;
if (currentRadioAccessTechnology) {
if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
return kReachableVia4G;
} else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
return kReachableVia2G;
} else {
return kReachableVia3G;
}
}
}
if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
return kReachableVia2G;
}
return kReachableVia3G;
}
return kReachableViaWWAN;
}