iOS の接続タイプを特定するにはどうすればよいですか?
現在、デバイスで Edge、3G、4G、または Wi-Fi が利用できるかどうかを知りたいです。
この情報は、異なるサイズの異なるデータをロードするために必要です。
そのため、接続タイプ「Edge」で 4 MB のイメージをロードしたくありません。
迅速な場合、次の関数を使用できます。
func getNetworkType()->String {
do{
let reachability:Reachability = try Reachability.reachabilityForInternetConnection()
do{
try reachability.startNotifier()
let status = reachability.currentReachabilityStatus
if(status == .NotReachable){
return ""
}else if (status == .ReachableViaWiFi){
return "Wifi"
}else if (status == .ReachableViaWWAN){
let networkInfo = CTTelephonyNetworkInfo()
let carrierType = networkInfo.currentRadioAccessTechnology
switch carrierType{
case CTRadioAccessTechnologyGPRS?,CTRadioAccessTechnologyEdge?,CTRadioAccessTechnologyCDMA1x?: return "2G"
case CTRadioAccessTechnologyWCDMA?,CTRadioAccessTechnologyHSDPA?,CTRadioAccessTechnologyHSUPA?,CTRadioAccessTechnologyCDMAEVDORev0?,CTRadioAccessTechnologyCDMAEVDORevA?,CTRadioAccessTechnologyCDMAEVDORevB?,CTRadioAccessTechnologyeHRPD?: return "3G"
case CTRadioAccessTechnologyLTE?: return "4G"
default: return ""
}
}else{
return ""
}
}catch{
return ""
}
}catch{
return ""
}
}
目的 C で:
最初に @import CoreTelephony をインポートします。
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
if(status == NotReachable)
{
//No internet
}
else if (status == ReachableViaWiFi)
{
//WiFi
}
else if (status == ReachableViaWWAN)
{
CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
NSString * carrierType = netinfo.currentRadioAccessTechnology;
if ([carrierType isEqualToString:CTRadioAccessTechnologyGPRS]) {
// @"2G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyEdge]) {
// @"2G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyWCDMA]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyHSDPA]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyHSUPA]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
// @"2G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyeHRPD]) {
// @"3G";
} else if ([carrierType isEqualToString:CTRadioAccessTechnologyLTE]) {
// @"4G";
}
}
CoreTelephony.framework が必要です。
let networkInfo = CTTelephonyNetworkInfo()
let networkString = networkInfo.currentRadioAccessTechnology
if networkString == CTRadioAccessTechnologyLTE{
// LTE (4G)
}else if networkString == CTRadioAccessTechnologyWCDMA{
// 3G
}else if networkString == CTRadioAccessTechnologyEdge{
// EDGE (2G)
}
import CoreTelephony
enum RadioAccessTechnology: String {
case cdma = "CTRadioAccessTechnologyCDMA1x"
case edge = "CTRadioAccessTechnologyEdge"
case gprs = "CTRadioAccessTechnologyGPRS"
case hrpd = "CTRadioAccessTechnologyeHRPD"
case hsdpa = "CTRadioAccessTechnologyHSDPA"
case hsupa = "CTRadioAccessTechnologyHSUPA"
case lte = "CTRadioAccessTechnologyLTE"
case rev0 = "CTRadioAccessTechnologyCDMAEVDORev0"
case revA = "CTRadioAccessTechnologyCDMAEVDORevA"
case revB = "CTRadioAccessTechnologyCDMAEVDORevB"
case wcdma = "CTRadioAccessTechnologyWCDMA"
var description: String {
switch self {
case .gprs, .edge, .cdma:
return "2G"
case .lte:
return "4G"
default:
return "3G"
}
}
}
// Example:
let networkInfo = CTTelephonyNetworkInfo()
let networkString = networkInfo.currentRadioAccessTechnology
let tecnology = RadioAccessTechnology(rawValue: networkString)
print(tecnology.description)
サードパーティのライブラリに依存しない優れたモジュール式の迅速な実装を見つけました。これは非常に簡単で、非常に軽量です。ここ で入手できますが、完成させるために、コードを次に示します。
//
// NetStatus.swift
// NetStatusDemo
//
// Created by Gabriel Theodoropoulos.
// Copyright © 2019 Appcoda. All rights reserved.
//
import Foundation
import Network
class NetStatus {
// MARK: - Properties
static let shared = NetStatus()
var monitor: NWPathMonitor?
var isMonitoring = false
var didStartMonitoringHandler: (() -> Void)?
var didStopMonitoringHandler: (() -> Void)?
var netStatusChangeHandler: (() -> Void)?
var isNetStatusConnected: Bool {
guard let monitor = monitor else { return false }
return monitor.currentPath.status == .satisfied
}
var interfaceType: NWInterface.InterfaceType? {
guard let monitor = monitor else { return nil }
return monitor.currentPath.availableInterfaces.filter {
monitor.currentPath.usesInterfaceType($0.type) }.first?.type
}
var availableInterfacesTypes: [NWInterface.InterfaceType]? {
guard let monitor = monitor else { return nil }
return monitor.currentPath.availableInterfaces.map { $0.type }
}
var isExpensive: Bool {
return monitor?.currentPath.isExpensive ?? false
}
// MARK: - Init & Deinit
private init() {
}
deinit {
stopMonitoring()
}
// MARK: - Method Implementation
func startMonitoring() {
guard !isMonitoring else { return }
monitor = NWPathMonitor()
let queue = DispatchQueue(label: "NetStatus_Monitor")
monitor?.start(queue: queue)
monitor?.pathUpdateHandler = { _ in
self.netStatusChangeHandler?()
}
isMonitoring = true
didStartMonitoringHandler?()
}
func stopMonitoring() {
guard isMonitoring, let monitor = monitor else { return }
monitor.cancel()
self.monitor = nil
isMonitoring = false
didStopMonitoringHandler?()
}
}