iOS detecta 3G o WiFi

No estoy seguro si esto es posible, pero tengo este escenario.

Tengo un website en mi UIWebView que tiene el enlace establecido en un UISegmentedController. El website puede detectar si está en wifi o en la networking 3g.

Ahora El controller segmentado apunta a 2 páginas diferentes. 1: una pantalla de inicio de session amigable para iPhone 2: la página de inicio, una vez que haya iniciado session.

Ahora esta es la pregunta:

¿Puedo progtwigr mi aplicación para detectar si está en wifi o 3g (sé que puedes hacer esto), pero luego, según la respuesta, ve al segmento 1 o 2

Tipo como este:

if(iPhone device is on 3g) { Go to Segment 1; } else { Go to Segment 0; } 

Usando el código apple proporcione aquí

 Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { //No internet } else if (status == ReachableViaWiFi) { //WiFi } else if (status == ReachableViaWWAN) { //3G } 

Si no desea importar la biblioteca de Reachability o tratar con los notificadores, puede usar este método síncrono simple:

 typedef enum { ConnectionTypeUnknown, ConnectionTypeNone, ConnectionType3G, ConnectionTypeWiFi } ConnectionType; + (ConnectionType)connectionType { SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "8.8.8.8"); SCNetworkReachabilityFlags flags; BOOL success = SCNetworkReachabilityGetFlags(reachability, &flags); CFRelease(reachability); if (!success) { return ConnectionTypeUnknown; } BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequinetworking) != 0); BOOL isNetworkReachable = (isReachable && !needsConnection); if (!isNetworkReachable) { return ConnectionTypeNone; } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { return ConnectionType3G; } else { return ConnectionTypeWiFi; } } 

Importe la capacidad de acceso de Apple y pruebe esto,

 #import "Reachability.h" #import <CoreTelephony/CTTelephonyNetworkInfo.h> //Try this Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { NSLog(@"none"); //No internet } else if (status == ReachableViaWiFi) { NSLog(@"Wifi"); //WiFi } else if (status == ReachableViaWWAN) { NSLog(@"WWAN"); //connection type CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; _carrier = [[netinfo subscriberCellularProvider] carrierName]; if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { NSLog(@"4G"); } } 

Referencias (los enlaces pueden romperse en el futuro):

  • iOS detecta 3G o WiFi
  • Detectar el tipo de connection del operador (3G / EDGE / GPRS)
  • ¿Cuáles son las diferencias entre 1G, 2G, 3G, 4G y 5G?
  • CDMA2000
  • wiki 2G
  • ¿Cuál es la diferencia entre el simulador de networking CDMA y WCDMA?

  • ¿Qué es "EV-DO Rev. A"?

Hice un contenedor de accesibilidad basado en bloques bastante simple que elimina todo el código de Alcanzabilidad similar a C obsoleto, se vierte en una forma mucho más de Cocoa.

Uso como:

 [EPPZReachability reachHost:hostNameOrIPaddress completition:^(EPPZReachability *reachability) { if (reachability.reachableViaCellular) [self doSomeLightweightStuff]; }]; 

Consulte Alcanzabilidad con bloques para uso diario en eppz! Blog , o agárrelo directamente desde eppz! Reachability en GitHub .

También funciona con direcciones IP , que resultó ser una function de envoltura de accesibilidad bastante rara.

Para swift podemos usar:

 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 "" } // Get carrier name }else{ return "" } }catch{ return "" } }catch{ return "" } } 
 #import <ifaddrs.h> #import <arpa/inet.h> BOOL CheckWiFi() { struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; BOOL hasWifi = NO; int err = getifaddrs(&interfaces); if(err == 0) { temp_addr = interfaces; while(temp_addr) { if(temp_addr->ifa_addr->sa_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)temp_addr->ifa_addr; if(memcmp(temp_addr->ifa_name, "en", 2) == 0) { hasWifi = YES; break; } } temp_addr = temp_addr->ifa_next; } } freeifaddrs(interfaces); return hasWifi; } 

Para verificar si está en un wifi, esto ahorra la costosa verificación de hacer una connection. Busque ifa_name "bridge" para verificar el uso compartido de Internet.

El método de classs es el siguiente

 +(NSString*)connectedNetworkType { Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { NSLog(@"none"); //No internet } else if (status == ReachableViaWiFi) { NSLog(@"Wifi"); //WiFi return @"Wifi"; } else if (status == ReachableViaWWAN){ NSLog(@"WWAN"); //connection type CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; // _carrier = [[netinfo subscriberCellularProvider] carrierName]; if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x])) { NSLog(@"2G"); return @"2G"; } else if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD])){ NSLog(@"3G"); return @"3G"; } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { NSLog(@"4G"); return @"4G"; } } return @"-1";//default unknown } 

Aquí hay una versión actualizada para iOS 6 con SimplePing de apple también incluida. Es compatible con ARC y comencé desde la solución de otra persona a Alcance. http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/

Espero que esto ayude a alguien.

Si está utilizando Xamarin o Monotouch, puede utilizar la class adaptada de Alcance del repository Xamarin GitHub:

https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs

Entonces agréguelo a su proyecto y llame a Reachability.InternetConnectionStatus()

Use este, construido con scope y fácil de usar, solo unas pocas líneas de código para integrar. Tiene una function de callback para informarle cuándo cambió la connection http://huytd.github.io/datatify/