iOS 手机网络类型判断

import Foundation
import CoreTelephony

/// 设备网络类型
public enum NetworkType {
    case unknow, unconnect, wifi
    /// 手机网络
    case phone(NetPhoneType)
    
    /// 当前的连接网络类型
    var type: String {
        switch self {
        case .unknow:
            return "unknow"
        case .unconnect:
            return "unconnect"
        case .wifi:
            return "wifi"
        case .phone(let netPhoneType):
            return netPhoneType.rawValue
        }
    }
    
    /// 手机网络类型
    public enum NetPhoneType: String {
        case unknow = "unknow"
        case _2G = "2G"
        case _3G = "3G"
        case _4G = "4G"
        case _5G = "5G"
        
        static var type: NetPhoneType {
            return getNetPhoneType()
        }
    }
}


private extension NetworkType.NetPhoneType {
    /// 获取手机网络类型
    static func getNetPhoneType() -> NetworkType.NetPhoneType {
        let info = CTTelephonyNetworkInfo()
        
        var type: String
        if #available(iOS 12, *) {
            type = info.serviceCurrentRadioAccessTechnology?.values.first ?? ""
        } else {
            type = info.currentRadioAccessTechnology ?? ""
        }
        
        guard !type.isEmpty else {
            return .unknow
        }
        
        let _2gTypes = [CTRadioAccessTechnologyGPRS,
                        CTRadioAccessTechnologyEdge,
                        CTRadioAccessTechnologyCDMA1x]
        if _2gTypes.contains(type) {
            return ._2G
        }
        
        let _3gTypes = [CTRadioAccessTechnologyHSDPA,
                        CTRadioAccessTechnologyWCDMA,
                        CTRadioAccessTechnologyHSUPA,
                        CTRadioAccessTechnologyCDMAEVDORev0,
                        CTRadioAccessTechnologyCDMAEVDORevA,
                        CTRadioAccessTechnologyCDMAEVDORevB,
                        CTRadioAccessTechnologyeHRPD]
        if _3gTypes.contains(type) {
            return ._3G
        }
        
        let _4gTypes = [CTRadioAccessTechnologyLTE]
        if _4gTypes.contains(type) {
            return ._4G
        }
        
        if #available(iOS 14.1, *) {
            let _5gTypes = [CTRadioAccessTechnologyNR, CTRadioAccessTechnologyNRNSA]
            if _5gTypes.contains(type) {
                return ._5G
            }
        }
        
        return .unknow
    }
}

  

原文地址:https://www.cnblogs.com/mustard22/p/15351919.html