2009-05-23 17 views
21

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.¿Hay alguna forma de determinar si el iphone está en itinerancia?

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 manzana, me encontré con la promesa de 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 iPhone con Jailbreak FS: Las preferencias -> General -> pestaña de redes es que los usuarios pueden activar o desactivar la itinerancia. Buscando en el archivo plist para esto ("/Applications/Preferences/Network.plist") yo era capaz de 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 
     ); 

Ésta es sin duda una ventaja, ya que parece que puedo inscribirse para recibir notificaciones 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. Comprobar la clase vierten fuentes de trampolín: He vertido las clases de trampolín usando class-dump. No he podido encontrar ninguna referencia a 'roaming' o 'itinerancia'

4. Obviamente, se inició revisando al SO para esto: No se pudo 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.

+0

Puede probar el [Apple Developer Forums] (http://devforums.apple.com/). –

Respuesta

23

¡Hay! 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 iPhone mantiene dos enlaces simbólicos:

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 comprobació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]); 
} 
+0

¡Agradable! Solución interesante – AriX

+1

¿Te funcionó esta solución? –

+0

Sí. No lo habría escrito por ti si no funcionara para mí. Sin embargo, estaba en un sistema jailbroken. Como se mencionó, la duda podría funcionar en el programa regular de iphone. – Aftermathew

1

la solución de los enlaces simbólicos no son la única manera de hacerlo, pero sin duda es el 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 se puede ver, el portador (proveedor de telefonía celular originales) línea contiene el archivo dentro de la 72410 "carpeta", 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.

+0

"la solución de los enlaces simbólicos no es la única forma de hacerlo, pero definitivamente es la mejor". ¿Cuáles son las otras soluciones que viene a tu mente? Estoy interesado en otro pero no puedo encontrar ninguno. – delannoyk

0

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 basado en la dirección IP del dispositivo, y luego puede comparar eso con los detalles de CTCarrier para determinar si el dispositivo está en itinerancia. Aquí está la respuesta estándar 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" 
} 

paquetes personalizados están disponibles, que también incluyen los detalles MNC/MCC de IPs móviles sin embargo. Vea http://ipinfo.io/developers para más detalles.

+0

Esto no funciona como se esperaba cuando mi dispositivo está conectado a wifi. – Tamil

+0

Sí, cuando estés en wifi obtendrás los detalles de la conexión wifi en lugar de la operadora. Sin embargo, puede detectar si está usando wifi o no usa las API de iOS, e incluso cuando sabe que está en otro país, puede ser útil. –

+0

Obtendrá la IP de su operador móvil HOME en itinerancia (así es como diseñó la red) –

Cuestiones relacionadas