我們常常會(huì)碰到這樣的需求,在2G網(wǎng)絡(luò)狀態(tài)下不下載高清圖片,只查看文字,在wifi、3G、4G可以下載高清圖片,以達(dá)到提升用戶體驗(yàn)的目的。最近在自己的項(xiàng)目里面也有類似的需求,查找資料,稍微修改了蘋果官方的Reachability實(shí)時(shí)監(jiān)測網(wǎng)絡(luò)狀態(tài)變化。
- 這里是Reachability下載地址點(diǎn)擊這里下載
1、不廢話,直接上干貨
在Reachability.m文件中導(dǎo)入CoreTelephony庫
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
找到此方法if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)修改,對了 ,先修改枚舉值在Reachability.h中
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN,
kRaeachableVia4G,
kReachableVia2G,
kReachableVia3G
} NetworkStatus;
增加代碼
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
/*
... but WWAN connections are OK if the calling application is using the CFNetwork APIs.
*/
returnValue = ReachableViaWWAN;
if (IOS_VERSION >= 7.0) {
CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
if (currentStr) {
if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
return kRaeachableVia4G;
}else if ([currentStr isEqualToString:CTRadioAccessTechnologyGPRS]|| [currentStr isEqualToString:CTRadioAccessTechnologyEdge]){
return kReachableVia2G;
}else{
return kReachableVia3G;
}
}
}
if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
return kReachableVia2G;
}
return kReachableVia3G;
}
return ReachableViaWWAN;
}
2、在需要的地方引入#import "Reachability.h"監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化通知
- (void)viewDidLoad {
[super viewDidLoad];
// 監(jiān)測網(wǎng)絡(luò)情況
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];
NSString *remoteHostName = @"www.apple.com";
NSString *remoteHostLabelFormatString = NSLocalizedString(@"Remote Host: %@", @"Remote host label format string");
UILabel *remoteHostLabel = [[UILabel alloc] init];
remoteHostLabel.text = [NSString stringWithFormat:remoteHostLabelFormatString, remoteHostName];
self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
[self.hostReachability startNotifier];
}
3、記得在delloc里面銷毀通知
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
4、處理通知方法
- (void)reachabilityChanged:(NSNotification *)no{
Reachability* curReach = [no object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NetworkStatus status = [curReach currentReachabilityStatus];
switch (status)
{
case NotReachable:
NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)不可達(dá)=======");
//其他處理
self.kReachableVia = @"當(dāng)前網(wǎng)絡(luò)狀態(tài)不可達(dá)";
break;
case ReachableViaWiFi:
NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為Wifi=======");
self.kReachableVia = @"ReachableViaWiFi";
//其他處理
break;
case kReachableVia2G:
NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為2G=======");
self.kReachableVia = @"kReachableVia2G";
break;
case kReachableVia3G:
NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為3G=======");
//其他處理
self.kReachableVia = @"kReachableVia3G";
break;
case kRaeachableVia4G:
NSLog(@"====當(dāng)前網(wǎng)絡(luò)狀態(tài)為4G=======");
self.kReachableVia = @"kRaeachableVia4G";
//其他處理
break;
default:
NSLog(@"你是外星來的嗎?");
//其他處理
self.kReachableVia = @"你是外星來的嗎?";
break;
}
}
結(jié)束語:網(wǎng)絡(luò)監(jiān)聽狀態(tài)就到這里了,還是挺簡單的,make一下,也希望能幫助到需要的人。