otros - liberar espacio sistema iphone
Saber si el dispositivo iOS tiene capacidades de datos celulares (8)
3G por sí mismo parece difícil de encontrar. Puede averiguar si un dispositivo puede realizar llamadas usando [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]
. Puede verificar si un dispositivo puede acceder a Internet, período (y con qué método puede suceder actualmente ) usando el código de accesibilidad :
NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection]
currentReachabilityStatus];
if(currentStatus == kReachableViaWWAN) // 3G
else if(currentStatus == kReachableViaWifi) // ...wifi
else if(currentStatus == kNotReachable) // no connection currently possible
..pero aparte de eso, no creo que pueda verificar la existencia de un módem 3G en el dispositivo. ***** Si no puede hacer una llamada y actualmente no tiene datos celulares activados y wifi desactivado , no podrás averiguar si es compatible con 3G.
Una forma alternativa (aunque no es compatible con el avance, así que probablemente no quiera hacer esto) es comparar el modelo del dispositivo con una lista exhaustiva, sabiendo cuáles tienen módems 3G, como se muestra here .
***** De acuerdo con la respuesta de Bentech, si desea investigar los nombres de los dispositivos (esto puede dejar de funcionar sin advertencia previa si Apple decide cambiar el nombre de la interfaz 3g), llame a getifaddrs
y pdp_ip0
interfaz pdp_ip0
.
Tengo una alternancia en mi aplicación que es "descargar solo en WiFi". Sin embargo, esa conmutación es inútil para iPod touch o WiFi-iPads.
¿Hay alguna forma de saber si el dispositivo tiene capacidades de datos celulares en código? Algo que funcionaría en el futuro también sería genial (como si saliera un iPod touch de 5ta generación con 3G).
Apple proporcionó el código aquí. https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html
Debe copiar Reachability.hy Reachability.m a su proyecto e importar Reachability.h a su clase, luego
Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];
while (networkStatus==NotReachable) {
NSLog(@"not reachable");
//no internet connection
return;
}
while (networkStatus==ReachableViaWWAN) {
NSLog(@" ReachableViaWWAN ");
}
while (networkStatus==ReachableViaWiFi) {
NSLog(@"ReachableViaWiFi");
}
Creo que deberías poder usar el Framework CoreTelephony .
Sí dice que es para que lo utilicen los operadores, por lo que no estoy seguro de si está en contra de TOS para acceder a él.
Los operadores pueden usar esta información para escribir aplicaciones que brindan servicios solo para sus propios suscriptores
En iOS 6.1, he podido usar Core Telephony para verificar con éxito la presencia de capacidades de banda base celular. Esto funciona en todos los iPad que probé: Verizon con servicio activado y sin servicio, AT&T con servicio actualmente desactivado, tarjeta SIM de entrada y salida, y un iPad solo con Wi-Fi.
El código que usé se ve así:
CTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;
Para todos los iPads con hardware de banda base celular, el carrier
no es nulo. Para el iPad solo con Wi-Fi, el carrier
es nulo.
Hola, deberías poder comprobar si tiene la interfaz pdp_ip0
#import <ifaddrs.h>
- (bool) hasCellular {
struct ifaddrs * addrs;
const struct ifaddrs * cursor;
bool found = false;
if (getifaddrs(&addrs) == 0) {
cursor = addrs;
while (cursor != NULL) {
NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
if ([name isEqualToString:@"pdp_ip0"]) {
found = true;
break;
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return found;
}
Esto no utiliza ninguna API privada.
Otra forma es extender esto: https://github.com/monospacecollective/UIDevice-Hardware/blob/master/UIDevice-Hardware.m con esto:
-(bool) hasCellular:(NSString*)modelIdentifier {
if ([modelIdentifier hasPrefix:@"iPhone"]) return YES;
if ([modelIdentifier hasPrefix:@"iPod"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad1,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,3"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad3,5"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad3,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,1"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,2"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,5"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad2,6"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad2,7"]) return YES;
if ([modelIdentifier isEqualToString:@"iPad4,4"]) return NO;
if ([modelIdentifier isEqualToString:@"iPad4,5"]) return YES;
if ([modelIdentifier isEqualToString:@"i386"]) return NO;
if ([modelIdentifier isEqualToString:@"x86_64"]) return NO;
return YES;
}
(Claramente, se podría editar hacia abajo para eliminar el NO o el SÍ solo en función de la forma en la que desee errar en caso de que haya un nuevo modelo ...)
Swift 3.0 (UIDevice + Extension) de la respuesta de @bentech
Agregue esta línea a su BridgingHeader.h:
#import <ifaddrs.h>
En algún otro lugar:
extension UIDevice {
/// A Boolean value indicating whether the device has cellular data capabilities (true) or not (false).
var hasCellularCapabilites: Bool {
var addrs: UnsafeMutablePointer<ifaddrs>?
var cursor: UnsafeMutablePointer<ifaddrs>?
defer { freeifaddrs(addrs) }
guard getifaddrs(&addrs) == 0 else { return false }
cursor = addrs
while cursor != nil {
guard
let utf8String = cursor?.pointee.ifa_name,
let name = NSString(utf8String: utf8String),
name == "pdp_ip0"
else {
cursor = cursor?.pointee.ifa_next
continue
}
return true
}
return false
}
}
Una forma de hacerlo es preguntar por la ubicación de los usuarios. Cuando sea lo más preciso posible, sabrá si el dispositivo tiene GPS. Todos los dispositivos que tengan GPS tendrán 3G. Y los que no tengan GPS no tendrán 3G.