• iOS获取当前网络连接状态WiFi、5G、4G、3G、2G


    iOS获取网络连接状态

    通过AFNetworking获取的网络状态只有未知无网络连接手机自带网络WIFI,需求是需要准确的定位到是WiFi、5G、4G、3G、2G,所以AFNetworking并不能满足需求,只能通过调用系统SCNetworkReachability跟CTTelephonyNetworkInfo来获取当前的网络连接状态。

    
    #import <SystemConfiguration/SCNetworkReachability.h>
    #import <CoreTelephony/CTTelephonyNetworkInfo.h>
    
    //无网络
    static NSString * notReachable = @"notReachable";
    
    #pragma mark --- 获取当前网络状态
    - (NSString *)getNetworkType {
        
        //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
        struct sockaddr_storage zeroAddress;
        
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.ss_len = sizeof(zeroAddress);
        zeroAddress.ss_family = AF_INET;
        
        // Recover reachability flags
        SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
        SCNetworkReachabilityFlags flags;
        
        //获得连接的标志
        BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
        CFRelease(defaultRouteReachability);
        
        //如果不能获取连接标志,则不能连接网络,直接返回
        if (!didRetrieveFlags) {
            return notReachable;
        }
        
        BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
        BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
        if (isReachable && !needsConnection) { }else{
            return notReachable;
        }
        
        
        if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired ) {
            
            return notReachable;
            
        } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) {
            
            return [self cellularType];
            
        } else {
            return @"WiFi";
        }
        
    }
    
    - (NSString *)cellularType {
        
        CTTelephonyNetworkInfo * info = [[CTTelephonyNetworkInfo alloc] init];
        
        NSString *currentRadioAccessTechnology;
        if (@available(iOS 12.1, *)) {
            if (info && [info respondsToSelector:@selector(serviceCurrentRadioAccessTechnology)]) {
                NSDictionary *radioDic = [info serviceCurrentRadioAccessTechnology];
                if (radioDic.allKeys.count) {
                    currentRadioAccessTechnology = [radioDic objectForKey:radioDic.allKeys[0]];
                } else {
                    return notReachable;
                }
            } else {
                
                return notReachable;
            }
            
        } else {
            
            currentRadioAccessTechnology = info.currentRadioAccessTechnology;
        }
        
        if (currentRadioAccessTechnology) {
            
            if (@available(iOS 14.1, *)) {
                
                if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNRNSA] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyNR]) {
                    
                    return @"5G";
                    
                }
            }
            
            if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
                
                return @"4G";
                
            } else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
                
                return @"3G";
                
            } else if ([currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS] || [currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
                
                return @"2G";
                
            } else {
                
                return @"Unknow";
            }
            
            
        } else {
            
            return notReachable;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109

    亲测满足当前需求,如果后续出到6G以及其他网络频段,需要增加相应的判断,返回对应的网络标识。

  • 相关阅读:
    【案例教学】华为云API图引擎服务 GES的便捷性—AI帮助快速处理图片小助手
    【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)
    【Git】idea提交项目到Gitee
    自然语音处理(NLP)系列(三)——什么是序列标注?
    1153:绝对素数
    pthread使用
    [爬虫练手]学校院系专业整理
    初探Git:理解和使用版本控制的魔法
    ChatGPT(1):ChatGPT初识
    如何使用 Rask AI 进行视频本地化
  • 原文地址:https://blog.csdn.net/Locationluqc/article/details/127741403