2012-05-07 17 views
6

Estoy usando la respuesta en este tema. iPhone - how to determine carrier of the device (AT&T, Verizon, etc?) que es lo mismo que getting operator details in iphone. Aunque funciona bien cuando se usa una tarjeta SIM, el nombre del proveedor anterior es el nombre del operador devuelto si no hay una tarjeta SIM. No detecta que la SIM se elimine.iPhone - Detectando la disponibilidad de la tarjeta SIM

Sé que esto contradice con la documentación de Apple de que si no hay transportista, el objeto de CTCarrier será nulo. Pero en mi aplicación, registré la información del operador y me da el último nombre de la operadora, aunque no hay ninguna tarjeta SIM instalada.

Respuesta

7

De acuerdo con la documentation para [CTCarrier carrierName]:

Si configura un dispositivo para un portador y después de retirar la tarjeta SIM, esta propiedad conserva el nombre de la compañía.

Hasta donde yo sé, no se puede detectar si la tarjeta SIM está instalada. Solo puede determinar si hay disponible una conexión WWAN usando Reachability.

+1

Esto ayudó, pero no lo hicieron resolver el problema. La conexión WWAN puede no existir, pero la tarjeta SIM puede estar insertada (si el usuario desconecta los datos y 3G). –

+1

Correcto, y no hay forma de comprobar si la tarjeta SIM está presente. –

+1

En el mismo enlace de documentación que proporcionó, ¿no se puede usar 'mobileCountryCode' o' mobileNetworkCode' para detectar si SIM está presente o no? La documentación indica que esos valores serán 'nil' si no hay SIM presente. No parece que esas propiedades se retienen – wnafee

4

El objeto CTCarrier tiene 5 propiedades:

allowsVOIP 
carrierName 
isoCountryCode 
mobileCountryCode 
mobileNetworkCode 

he hecho algunas pruebas con respecto a CTCarrier y he llegado a la conclusión de que para iOS 7 solamente CARRIERNAME y allowsVOIP se retienen cuando se retira SIM. isoCountryCode, mobileCountryCode y mobileNetworkCode se reinician para iOS 7. Así es como puedes detectar si hay una tarjeta SIM presente o no.

Para iOS 6, todos los valores se conservan.

que realizaron los ensayos usando un iPhone 4S y el iPhone 5 iOS que ejecutan 7.

6
@import CoreTelephony; 

-(BOOL)hasCellularCoverage 
{ 
    CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new]; 
    CTCarrier *carrier = [networkInfo subscriberCellularProvider]; 


    if (!carrier.isoCountryCode) { 
     NSLog(@"No sim present Or No cellular coverage or phone is on airplane mode."); 
     return NO; 
    } 
    return YES; 
} 
0

versión Swift:

func hasCellularCoverage() -> Bool { 

    let networkInfo = CTTelephonyNetworkInfo() 

    guard let info = networkInfo.subscriberCellularProvider else {return false} 

    if let carrier = info.isoCountryCode { 
     print("No sim present Or No cellular coverage or phone is on airplane mode. Carrier = \(carrier)"); 
     return true 
    } 

    return false 

} 

o

func hasCellularCoverage() -> Bool { 

    let networkInfo = CTTelephonyNetworkInfo() 

    guard let info = networkInfo.subscriberCellularProvider else {return false} 

    return info.isoCountryCode != nil ? true : false 

} 
+0

Gracias por compartir el código. Aunque no creo que detecte el modo avión. –

Cuestiones relacionadas