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;
}
Aquí hay una versión actualizada para iOS 6 con SimplePing de apple también incluida. Es compatible con ARC y comencé con la corrección de otra persona para Alcance. http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/
Espero que esto ayude a alguien.
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 está utilizando Xamarin o Monotouch puede usar la clase adaptada de Accesibilidad del repositorio de Xamarin GitHub:
https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs
Así que agréguelo a su proyecto y llame a Reachability.InternetConnectionStatus()
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.