iOS 中如何判斷當(dāng)前是2G/3G/4G/WiFi

最近經(jīng)常會碰到一些問到如何判斷手機網(wǎng)絡(luò),在這里我簡單的介紹幾種方法:

一、RealReachability Demo下載

使用Reachability時,如果網(wǎng)絡(luò)變化,會給出一個通知,但是我們獲取的網(wǎng)絡(luò)狀態(tài)只有WiFi/WWAN/NotReach幾種。我們可以在Reachability返回的通知里,WWAN這種類型下,再做上面的網(wǎng)絡(luò)判斷即可。但是更優(yōu)的做法就將判斷放在Reachability中,在使用的時候直接返回不同的網(wǎng)絡(luò)狀態(tài)。
由于最新的Reachability已經(jīng)支持了IPV6,我也是在最新的Reachability上做了一些改進(jìn)。
大部分方法跟Reachability一樣,我擴展了枚舉類型,修改了網(wǎng)絡(luò)狀態(tài)判斷。
主要修改如下:

typedef NS_ENUM(NSUInteger, HJNetWorkStatus) {
    HJNetWorkStatusNotReachable = 0,
    HJNetWorkStatusUnknown = 1,
    HJNetWorkStatusWWAN2G = 2,
    HJNetWorkStatusWWAN3G = 3,
    HJNetWorkStatusWWAN4G = 4,
    HJNetWorkStatusWiFi = 5,
};

簡單的介紹下RealReachability使用

頭文件:#import "RealReachability.h"

@property (nonatomic, assign) BOOL isUserReal; // 當(dāng)前網(wǎng)絡(luò)是否可用
@property (nonatomic, assign) NSInteger status; // 當(dāng)前網(wǎng)絡(luò)狀態(tài)

//發(fā)送通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netWorkChanged:) name:kRealReachabilityChangedNotification object:nil];

- (void)netWorkChanged:(NSNotification *)notification
{
    RealReachability *reachability = (RealReachability *)notification.object;
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    self.isUserReal = YES;
    switch (status) {
        case RealStatusNotReachable:
            self.isUserReal = NO;
            self.status = 0;
            [self alertMessage:@"沒網(wǎng)絡(luò)"];
            break;
        case RealStatusViaWiFi:
            self.isUserReal = YES;
            self.status = 1;
            [self alertMessage:@"WIFI"];
            break;
        case RealStatusViaWWAN:
            self.isUserReal = YES;
            self.status = 2;
            [self alertMessage:@"2G/3G/4G"];
            break;
            
        default:
            break;
    }
}

二、根據(jù)狀態(tài)欄的wifi標(biāo)志

- (NSString *)getNetWorkStates{
    UIApplication *app = [UIApplication sharedApplication];
    NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
    NSString *state = [[NSString alloc]init];
    int netType = 0;
    //獲取到網(wǎng)絡(luò)返回碼
    for (id child in children) {
        if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
            //獲取到狀態(tài)欄
            netType = [[child valueForKeyPath:@"dataNetworkType"]intValue];
             
            switch (netType) {
                case 0:
                    state = @"無網(wǎng)絡(luò)";
                    //無網(wǎng)模式
                    break;
                case 1:
                    state =  @"2G";
                    break;
                case 2:
                    state =  @"3G";
                    break;
                case 3:
                   state =   @"4G";
                    break;
                case 5:
                {
                    state =  @"wifi";
                    break;
                default:
                    break;
            }
        }
    }
    //根據(jù)狀態(tài)選擇
    return state;
}

結(jié)束語

到這里就結(jié)束了,如若不懂的話可以??留言,也可以加入群討論
喜歡的話 記得關(guān)注、收藏、點贊喲

群號:552048526

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容