2009-05-12 23 views
41

¿Hay alguna manera de conocer el soporte de la célula en un iPhone mediante programación?Recuperando el nombre del operador del iPhone mediante programación

** ** actualización

Busco el nombre de la compañía, que el iPhone está conectado.

+5

¿Qué, decir que hay iPhone portadores que no sean AT & T?

+0

¿Estás hablando de a quién está conectado el teléfono actualmente (es decir, puede estar en roaming) o quién es el operador del que recibes las facturas? – crashmstr

+12

Es posible que no haya oído hablar de él, pero hay otros países en el mundo. Y curiosamente, tienen tecnología móvil. – mentat

Respuesta

76

En IOS 4, el marco CoreTelephony es utilizable, He aquí un fragmento de obtener el nombre de la compañía:

CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; 
CTCarrier *carrier = [netinfo subscriberCellularProvider]; 
NSLog(@"Carrier Name: %@", [carrier carrierName]); 
[netinfo release]; 

Enlace contra CoreTelephony e incluir en sus cabeceras:

#import <CoreTelephony/CTTelephonyNetworkInfo.h> 
#import <CoreTelephony/CTCarrier.h> 
+10

De acuerdo con la documentación de Apple, esto siempre le brinda información sobre su transportista honme, no sobre el transportista al que está actualmente conectado cuando está en roaming. – phoenies

+5

No olvide poner '#import ' al al principio de su archivo – zekel

+7

Agregue #import de lo contrario, se mostrará una advertencia de que "método de carrierName no encontrado". – HarshIT

2

No hay una API pública para obtener el nombre del operador. Si no necesita publicar en la App Store, puede utilizar aplicaciones privadas.

VVCarrierParameters.h en el paquete VisualVoiceMail parece tener un método de clase carrierServiceName que podría ser lo que necesita. Suelta ese encabezado en tu proyecto y llama al [VVCarrierParameters carrierServiceName].

Tenga en cuenta que su aplicación probablemente será rechazada si hace esto.

+0

¿Cómo reparar el error 'Símbolos no encontrados' al enlazar? Gracias – ohho

+0

Tristemente este método siempre devuelve nil para mí. :( – Legoless

10

sólo para hacer una nota aquí ... Probé esta API en SIM diferentes y parece que el nombre del operador con el que está bloqueado el iPhone se devuelve con [carrer carrierName] !!

He probado esto en 2 iphones, uno bloqueado y el otro no, y para el bloqueado, independientemente del proveedor de SIM, devuelve el nombre del operador que está bloqueado cada vez que ejecuto mi aplicación de prueba. ¡Sin embargo, tenga en cuenta que el MNC sí cambia!

+1

Buen comentario. No tuve conocimiento de esto hasta que vi esta respuesta. Puedo confirmar que estoy obteniendo el mismo comportamiento: carrierName devuelve el nombre del operador bloqueado, no el operador SIM. –

+0

probado en iOS 7, teléfono desbloqueado: siempre devuelve "operador "como carrierName. Por lo tanto, no es posible determinar correctamente qué operador está en el teléfono. rned es igual a la cadena que se muestra en Configuración -> General -> Acerca de en Carrier. Sin embargo, el número de versión se pierde. – Legoless

+0

Esto es correcto. MNC es la única prueba precisa de portadora de CTCarrier. Caché también el valor MNC, ya que devolverá nulo si el usuario no tiene conexión de red, está en modo avión o ha eliminado su SIM. – NSAlexC

1

Durante el desarrollo de Alpha, me encontré con el mismo problema. El proyecto en sí no estaba limitado a usar API pública, así que primero probé la solución de @Jason Harwig. Como no podía hacer que funcionara, pensé en otra opción.

Mi solución utiliza la API privada para acceder a la _serviceString Ivar de la etiqueta (UIStatusBarServiceItemView) que se muestra en la barra de estado.

Se basa en la barra de estado que tiene un valor de portadora y solo necesita UIKit para funcionar.

- (NSString *)carrierName 
{ 
    UIView* statusBar = [self statusBar]; 

    UIView* statusBarForegroundView = nil; 

    for (UIView* view in statusBar.subviews) 
    { 
     if ([view isKindOfClass:NSClassFromString(@"UIStatusBarForegroundView")]) 
     { 
      statusBarForegroundView = view; 
      break; 
     } 
    } 

    UIView* statusBarServiceItem = nil; 

    for (UIView* view in statusBarForegroundView.subviews) 
    { 
     if ([view isKindOfClass:NSClassFromString(@"UIStatusBarServiceItemView")]) 
     { 
      statusBarServiceItem = view; 
      break; 
     } 
    } 

    if (statusBarServiceItem) 
    { 
     id value = [statusBarServiceItem valueForKey:@"_serviceString"]; 

     if ([value isKindOfClass:[NSString class]]) 
     { 
      return (NSString *)value; 
     } 
    } 

    return @"Unavailable"; 
} 

- (UIView *)statusBar 
{ 
    NSString *statusBarString = [NSString stringWithFormat:@"%@ar", @"_statusB"]; 
    return [[UIApplication sharedApplication] valueForKey:statusBarString]; 
} 

Solo probé el método con aplicaciones que tienen una barra de estado visible. Devuelve la misma cadena que se muestra en la barra de estado, por lo que funciona correctamente incluso en itinerancia.

Este método no es seguro para la App Store.

0

Para los usuarios de SWIFT puede probar esto:

import CoreTelephony 

static var carrierName:String? { 
    let networkInfo = CTTelephonyNetworkInfo() 
    let carrier = networkInfo.subscriberCellularProvider 
    return carrier?.carrierName 
} 
0

obtener el nombre portadora de barra de estado en el caso si la base de telefonía devuelve "Carrier"

func getCarrierName() -> String? { 

    var carrierName: String? 

    let typeName: (Any) -> String = { String(describing: type(of: $0)) } 

    let statusBar = UIApplication.shared.value(forKey: "_statusBar") as! UIView 

    for statusBarForegroundView in statusBar.subviews { 
     if typeName(statusBarForegroundView) == "UIStatusBarForegroundView" { 
      for statusBarItem in statusBarForegroundView.subviews { 
       if typeName(statusBarItem) == "UIStatusBarServiceItemView" { 
        carrierName = (statusBarItem.value(forKey: "_serviceString") as! String) 
       } 
      } 
     } 
    } 
    return carrierName 
} 
Cuestiones relacionadas