歡迎你們關注個人公衆號,我會按期分享一些我在項目中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來
javascript
文章也會同步更新到個人博客:
ppsheep.comhtml
若是有在使用AFNetworking朋友知道,在AF裏只能區分當前網絡是WiFi網絡仍是蜂窩網絡在3G、4G出現之後,咱們就有一個新需求,須要區分2G、3G、4G網絡了,雖然同爲蜂窩網絡可是速度但是千差萬別,有時咱們會感受到4G比WiFi還快,固然流量也是跑的至關肉痛java
下面咱們就來說一講怎麼區分2G 3G 4G網絡 git
首先咱們須要下載蘋果官方的一個示例工程 github
developer.apple.com/library/con…網絡
在這個工程裏有咱們須要用到的 蘋果官方提供的實時監測網絡的類 咱們是在這個基礎上 稍做修改就能夠作到app
進入網頁 ui
在示例代碼中 將Reachability類拷貝到咱們的項目當中spa
首先修改Reachability類中的網絡類型枚舉:code
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN,
kReachableVia2G,
kReachableVia3G,
kReachableVia4G
} NetworkStatus;複製代碼
而後再.m文件中 找到方法
- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags;複製代碼
增長判斷2G 3G 4G的方法
在 if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) 判斷中加上代碼
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
returnValue = ReachableViaWWAN;
CTTelephonyNetworkInfo *phonyNetwork = [[CTTelephonyNetworkInfo alloc] init];
NSString *currentStr = phonyNetwork.currentRadioAccessTechnology;
if (currentStr) {
if ([currentStr isEqualToString:CTRadioAccessTechnologyLTE]) {
return kReachableVia4G;
}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;
}複製代碼
在須要用到的地方引入咱們修改事後的Reachability
監聽網絡變化
//添加網絡監測
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];
//開啓網絡監測
self.intertReach = [Reachability reachabilityForInternetConnection];
[self.intertReach startNotifier];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 300, 30)];
[self.view addSubview:label];
self.label = label;
//獲取當前的網絡狀態
NetworkStatus status = [self.intertReach currentReachabilityStatus];
[self judgeNetWorkStatus:status];複製代碼
當網絡發生改變時 會觸發
/**
當網絡狀態發生變換時 會觸發這個方法
@param no 通知
*/
- (void)reachabilityChanged:(NSNotification *)no{
Reachability* curReach = [no object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NetworkStatus status = [curReach currentReachabilityStatus];
[self judgeNetWorkStatus:status];
}複製代碼
仍是很簡單的
源代碼 放在了