telefono - ¿Hay alguna forma de determinar si el iphone está en itinerancia?
porque mi iphone no agarra los datos moviles (3)
Estoy trabajando en una aplicación de iPhone y realmente me gustaría determinar si el dispositivo está en itinerancia para que pueda evitar de forma inteligente costosas conexiones de mis usuarios si están fuera de su red doméstica.
La aplicación que estoy escribiendo es para teléfonos jailbreak, sin embargo, preferiría usar SDK estándar si es posible.
Esto es lo que ya he encontrado:
1. SDK de Apple: en la documentación de Apple, encontré la promesa en la API SCNetworkReachability de Apple. La API proporciona acceso a cosas tales como si está en una red WIFI o de teléfono celular, si una conexión de red está actualmente establecida, etc. Sin embargo, al buscar en la referencia de API de SCNetworkReachability, ''roam'' o ''roaming'' aparecen nulos. Lo mismo ocurre con su código de muestra.
2. Grep de un Jailbroken iPhone FS: la pestaña de preferencias -> general -> red es donde los usuarios pueden activar o desactivar su itinerancia. Buscando en el archivo plist para esto ("/Applications/Preferences/Network.plist") pude encontrar las siguientes referencias:
PostNotification = "com.apple.commcenter.InternationalRoamingEDGE.changed";
cell = PSSwitchCell;
default = 1;
defaults = "com.apple.commcenter";
key = InternationalRoamingEDGE;
label = "EDGE_ROAMING_TOGGLE";
requiredCapabilities = (
telephony
);
Esto es ciertamente una ventaja, ya que parece que puedo suscribirme a las notificaciones de que el usuario ha cambiado la configuración de InternationalRoaming. Aún así, no estoy seguro de cómo convertir esto en el conocimiento de que de hecho están vagando actualmente.
3. Verifique las fuentes de SpringBoard abandonadas en clase: he descargado las clases de SpringBoard usando class-dump . No pude encontrar ninguna referencia a ''roam'' o ''roaming''
4. Obviamente, comencé revisando SO para esto: no pude encontrar nada relacionado.
Otros pasos: ¿Alguien tiene algún consejo aquí? Sé que esto es posible. Apple claramente ha hecho que sea muy difícil de encontrar sin embargo. Dudo mucho que esto sea posible sin usar un marco privado. (como CoreTelephony). Como esta es una aplicación jailbroken, puedo recurrir a raspar la pantalla del nombre del operador con el código insertado en el SpringBoard, pero preferiría no seguir esa ruta. Cualquier consejo muy apreciado. Gracias.
¡Ahi esta! No está documentado en absoluto, y dudo mucho de que esto funcione en un teléfono sin jailbreak (ya que requiere el uso de archivos que no están en el sandbox). Sin embargo, así es como se hace.
El sistema de archivos de iPhone mantiene dos softlinks:
static NSString *carrierPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.carrier.plist";
static NSString *operatorPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.operator.plist";
cuando estos enlaces apuntan al mismo archivo, el teléfono no está en itinerancia. Al señalar diferentes archivos, el teléfono está sonando.
Código simplificado (sin verificación de errores, etc.):
- (BOOL)isRoaming
{
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error;
NSString *carrierPListPath = [fm destinationOfSymbolicLinkAtPath:carrierPListSymLinkPath error:&error];
NSString *operatorPListPath = [fm destinationOfSymbolicLinkAtPath:operatorPListSymLinkPath error:&error];
return (![operatorPListPath isEqualToString:carrierPListPath]);
}
En un dispositivo que no es de jailbreak, puede usar servicios de terceros como http://ipinfo.io (mi propio servicio) para averiguar el país actual de código de operador, incluso basado en la dirección IP del dispositivo, y luego puede comparar eso con el Detalles de CTCarrier para determinar si el dispositivo está en itinerancia. Aquí está la respuesta estándar de la API ipinfo.io:
$ curl ipinfo.io/24.32.148.1
{
"ip": "24.32.148.1",
"hostname": "doc-24-32-148-1.pecos.tx.cebridge.net",
"city": "Pecos",
"region": "Texas",
"country": "US",
"loc": "31.3086,-103.5892",
"org": "AS7018 AT&T Services, Inc.",
"postal": "79772"
}
Los paquetes personalizados están disponibles que también incluyen los detalles de mnc / mcc de las IP móviles. Ver http://ipinfo.io/developers para más detalles.
la solución de los enlaces simbólicos no es la única forma de hacerlo, pero definitivamente es la mejor. ¡Como me di cuenta, las cadenas devueltas contienen los códigos MCC y MNC del operador y el operador! Incluso el marco central de telefonía no puede recuperar esas informaciones sobre el operador al que está conectado su iPhone cuando está en itinerancia.
Logs:
carrier: /System/Library/Carrier Bundles/iPhone/72410/carrier.plist
operator: /System/Library/Carrier Bundles/iPhone/20810/carrier.plist
Como puede ver, la línea del operador (proveedor celular original) contiene el archivo dentro de la "carpeta" 72410, lo que significa MCC 724 (Brasil) y MNC 10 (VIVO). El operador (en realidad, el que mi teléfono celular está conectado ahora - estoy en itinerancia) se encuentra dentro de la carpeta 20810, lo que significa MCC 208 (Francia) y MNC 10 (SFR).
Por cierto, estoy usando iPhone 4 con iOS5.