ios - 在没有第三方库的情况下确定 iOS 14 Swift 5 中的网络类型
问题描述
CTTelephonyNetworkInfo.currentRadioAccessTechnology
在 iOS 12 中已弃用。那么是否有任何 api 来获取网络类型?我们可以使用 NWPathMonitor 知道 wifi、蜂窝、以太网类型,但不知道 3g、4g、5g 等。有没有完整的解决方案。
解决方案
enum Interface { /// A virtual or otherwise unknown interface type case other /// A Wi-Fi link case wifi /// A Cellular link case cellular(CellularType) /// A Wired Ethernet link case wiredEthernet enum CellularType: String, GaugeNetworkType { /// 2G network type case twoG = "2G" /// 3G network type case threeG = "3G" /// 4G network type case fourG = "4G" /// 5G network type case fiveG = "5G" // unknown network type case unKnown var value: String { self.rawValue } } var value: String { switch self { case .wifi: return "Wifi" case .wiredEthernet: return "WiredEthernet" case .cellular(let type): return type.rawValue case .other: return "Other" } } } func interface(with path: NWPath) -> Interface { if path.usesInterfaceType(.wifi) { return .wifi } else if path.usesInterfaceType(.cellular) { return getCellularType(telephonyInfoData) } else if path.usesInterfaceType(.wiredEthernet) { return .wiredEthernet } else { return .other } } func getCellularType(_ infoData: CTTelephonyNetworkInfoProtocol) -> Interface { guard let carrierTypeName = infoData.cellularType else { return .other } logger.debug(withMessage: "carrierTypeName.. \(carrierTypeName)", category: LogCategory.application) if #available(iOS 14.1, *) { switch carrierTypeName { case CTRadioAccessTechnologyGPRS, CTRadioAccessTechnologyEdge, CTRadioAccessTechnologyCDMA1x: return .cellular(.twoG) case CTRadioAccessTechnologyWCDMA, CTRadioAccessTechnologyHSDPA, CTRadioAccessTechnologyHSUPA, CTRadioAccessTechnologyCDMAEVDORev0, CTRadioAccessTechnologyCDMAEVDORevA, CTRadioAccessTechnologyCDMAEVDORevB, CTRadioAccessTechnologyeHRPD: return .cellular(.threeG) case CTRadioAccessTechnologyLTE: return .cellular(.fourG) case CTRadioAccessTechnologyNRNSA, CTRadioAccessTechnologyNR: return .cellular(.fiveG) default: return .cellular(.unKnown) } } else { switch carrierTypeName { case CTRadioAccessTechnologyGPRS, CTRadioAccessTechnologyEdge, CTRadioAccessTechnologyCDMA1x: return .cellular(.twoG) case CTRadioAccessTechnologyWCDMA, CTRadioAccessTechnologyHSDPA, CTRadioAccessTechnologyHSUPA, CTRadioAccessTechnologyCDMAEVDORev0, CTRadioAccessTechnologyCDMAEVDORevA, CTRadioAccessTechnologyCDMAEVDORevB, CTRadioAccessTechnologyeHRPD: return .cellular(.threeG) case CTRadioAccessTechnologyLTE: return .cellular(.fourG) default: return .cellular(.unKnown) } } }
推荐阅读
- symfony - 无法使用 webpack-encore 编译材料组件
- php - 如何在某个命名空间中打开 .json 文件
- amazon-cloudfront - CloudFront Origin 基本授权
- php - 为数据库中的每个结果提供不同的链接 - PHP
- java - 如何正确截屏Android设备?
- jquery - jquery滚动到数据图像ID
- android - 重新创建活动后增加内存消耗
- graphviz - 如何在不改变安排的情况下将交易对手 B 连接到 C 以及反之亦然
- javascript - 函数 .data() 不读取内容 onCreate FIrebase 云触发器
- ansible - 如何从 Ansible 连接到 Rally