Detectar el tipo de conexión del operador (3G / EDGE / GPRS)

¿Cómo puedo obtener el tipo de conexión de una red de operador?

  • Puedo obtener si la conexión es WIFI o WWAN usando la clase de Reachability
  • Puedo obtener banderas de red

    Estado de bandera de alcanzabilidad: WR t —— localWiFiStatusForFlags

  • Puedo obtener WIFI SSID usando CaptiveNetwork

Interfaces compatibles: (en0)

 en0 => { BSSID = "xx:xx:xx:xx:xx:xx"; SSID = MyWifiNetwork; SSIDDATA = ; } 

Pero no puedo diferenciar la conexión 3G, EDGE o GPRS.

¿Alguna idea también con iOS API privada?

Gracias.

Desde iOS 7 puedes usar:

 CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new]; NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); [NSNotificationCenter.defaultCenter addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { NSLog(@"New Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); }]; 

También encontré esto para detectar una conexión lenta o rápida:

 - (BOOL)isFast:(NSString*)radioAccessTechnology { if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { return NO; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { return NO; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { return NO; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { return YES; } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { return YES; } return YES; } 

Aquí la solución OLD , utilizando API privada , en particular SoftwareUpdateServices.framework

 Class NetworkMonitor = NSClassFromString(@"SUNetworkMonitor"); NSLog(@"TYPE: %d", [NetworkMonitor currentNetworkType]); 

Vuelve:

0: SIN DATOS
1: WIFI
2: GPRS / EDGE
3: 3G

Espero que esto ayude a la comunidad.

La respuesta aceptada no funciona en iOS 10. Encontré una solución y configuré un temporizador en AppDelegate, que comprueba la propiedad currentRadioAccessTechnology cada 5 segundos. Por lo tanto, también necesitamos una función para verificar si la conexión WIFI está disponible en lugar de la tecnología de acceso de radio.

Compruebe si la conexión WIFI está disponible:

 class func isConnectedToWlan() -> Bool { var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) zeroAddress.sin_family = sa_family_t(AF_INET) let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) } } var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { return false } //Only Working for WIFI let isReachable = flags == .reachable let needsConnection = flags == .connectionRequired return isReachable && !needsConnection } 

Configura el temporizador así:

 Timer.scheduledTimer(timeInterval: TimeInterval.seconds(5.0), target: self, selector: #selector(showNetworkMessage), userInfo: nil, repeats: true) 

Selector que se llama cada 5 segundos:

  guard !Reachability.isConnecteToWlan() else { //Connected to WLAN return } guard let currentRadioAccessTechnology = info.currentRadioAccessTechnology else { // No internet connection return } guard (currentRadioAccessTechnology == CTRadioAccessTechnologyGPRS || currentRadioAccessTechnology == CTRadioAccessTechnologyEdge) else { // 3G, LTE fast radio access Technology return } if lastRadioAccessTechnology != nil { guard let lastRadioAccessTechnology = lastRadioAccessTechnology, (lastInfo != currentRadioAccessTechnology || lastInfo != currentRadioAccessTechnology) else { //Internet connection did not change return } } // Internet connection changed to Edge or GPRS // Store lastRadioAccessTechnology to check if internet connection changed lastRadioAccessTechnology = currentRadioAccessTechnology 

Estoy trabajando en una aplicación de iPhone que requiere la capacidad de reconocer qué tipo de conexión a Internet se está utilizando actualmente (Wifi, 3G, Edge, etc.). Encontré una manera simple de verificar mediante el uso del código de muestra Apples Reachability. Parece que hay una escasez de información sobre esto en línea, espero que esto pueda ayudar a alguien.

Primero copia Reachability.m / .h en tu proyecto e incluye #include “Reachability.h” en tu clase.

 Reachability *reach = [[Reachability alloc]init]; if (reach.internetConnectionStatus == NotReachable) { NSLog(@"No Connection Found"); } else if (reach.internetConnectionStatus == ReachableViaCarrierDataNetwork) { NSLog(@"3G or Edge"); } else if (reach.internetConnectionStatus == ReachableViaWiFiNetwork) { NSLog(@"Wifi Connection"); } [reach release]; 

Este código puede no ser la mejor manera de lograr esto, pero parece ser el enfoque más simple.