iOS網路監測區分2、3、4G

ppsheep發表於2016-10-26

歡迎大家關注我的公眾號,我會定期分享一些我在專案中遇到問題的解決辦法和一些iOS實用的技巧,現階段主要是整理出一些基礎的知識記錄下來

iOS網路監測區分2、3、4G

文章也會同步更新到我的部落格:
ppsheep.com

如果有在使用AFNetworking朋友知道,在AF裡只能區分當前網路是WiFi網路還是蜂窩網路在3G、4G出現以後,我們就有一個新需求,需要區分2G、3G、4G網路了,雖然同為蜂窩網路但是速度可是千差萬別,有時我們會感覺到4G比WiFi還快,當然流量也是跑的相當肉痛

下面我們就來講一講怎麼區分2G 3G 4G網路

下載Reachability

首先我們需要下載蘋果官方的一個示例工程

developer.apple.com/library/con…

在這個工程裡有我們需要用到的 蘋果官方提供的實時監測網路的類 我們是在這個基礎上 稍作修改就可以做到

進入網頁

iOS網路監測區分2、3、4G
1

在示例程式碼中 將Reachability類拷貝到我們的專案當中

iOS網路監測區分2、3、4G
2

修改Reachability

首先修改Reachability類中的網路型別列舉:

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

使用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];
}複製程式碼

還是很簡單的

原始碼 放在了

github.com/yangqian111…

相關文章