iphone - Detectar el tipo de conexión del operador(3G/EDGE/GPRS)
objective-c ios (4)
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.
¿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 = <x1x1x1x1 x1x1x1x1 x1>;
}
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;
}
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.
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