versiones ultima reciente para numero mas lista historia aƱos actualizaciones ios objective-c wifi reachability 3g

ultima - numero de versiones de ios



iOS Detect 3G o WiFi (10)

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

Tengo un sitio web que se muestra en mi UIWebView que tiene el enlace establecido en un UISegmentedController. El sitio web puede detectar si está en wifi o en la red 3g.

Ahora El controlador segmentado apunta a 2 páginas diferentes. 1 - una pantalla de inicio de sesión amigable para iPhone 2 - la página de inicio, una vez que haya iniciado sesión.

Ahora esta es la pregunta:

¿Puedo programar 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 así:

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



El método de clase 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 }


Hice un envoltorio de Reachability basado en bloques bastante simple que quita todo el código obsoleto C-like Reachability, vertido en una forma mucho más Cocoa.

Uso como:

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

Vea Accesibilidad con bloques para uso diario en eppz! Blog , o tómela directamente de eppz! Alcanzabilidad en GitHub .

También funciona con direcciones IP , lo que resultó ser una función de envoltura Visibilidad muy rara.


Importa la Reachability de Apple y prueba 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 fallar en el futuro):


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 "" } }



Si no desea importar la biblioteca de Accesibilidad o tratar con notificadores, puede usar este método simple sincrónico:

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 & kSCNetworkReachabilityFlagsConnectionRequired) != 0); BOOL isNetworkReachable = (isReachable && !needsConnection); if (!isNetworkReachable) { return ConnectionTypeNone; } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { return ConnectionType3G; } else { return ConnectionTypeWiFi; } }


Usa este, construido con Accesibilidad y fácil de usar, solo unas pocas líneas de código para integrar. Tiene una función de devolución de llamada que le informa cuando la conexión ha cambiado http://huytd.github.io/datatify/


Usando el código apple proporcione here

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 }


#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 comprobar si está en un wifi, ahorra la costosa comprobación de establecer una conexión. Busca el "puente" de ifa_name para verificar el uso compartido de internet.