Recuperando Nome da Operadora do iPhone Programaticamente

Existe uma maneira de saber a operadora de celular em um iPhone programaticamente?

** update **

Estou procurando o nome da operadora à qual o iPhone está conectado.

No iOS 4, o framework CoreTelephony é utilizável, aqui está um trecho para obter o nome da operadora:

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

Vincule com o CoreTelephony e inclua em seus headers:

 #import  #import  

Só para fazer uma nota aqui .. Eu testei esta API em diferentes SIMs e parece que o nome do operador que o iPhone está bloqueado é retornado com [carrer carrierName] !!

Eu testei isso em 2 iphones, um bloqueado e outro não, e para o bloqueado, independentemente do provedor do SIM, ele retorna o nome do operador para o qual ele está bloqueado toda vez que eu executo meu aplicativo de teste. Note, no entanto, que a MNC muda!

Não há uma API pública para obter o nome da operadora. Se você não precisa publicar na App Store, pode usar as APIs privadas.

VVCarrierParameters.h no pacote VisualVoiceMail parece ter um método de class carrierServiceName que pode ser o que você precisa. Solte esse header no seu projeto e chame [VVCarrierParameters carrierServiceName] .

Observe que seu aplicativo provavelmente será rejeitado se você fizer isso .

Ao desenvolver o Alpha , encontrei o mesmo problema. O projeto em si não se limitou a usar apenas API pública, então primeiro tentei a solução da @Jason Harwig. Como não consegui fazê-lo funcionar, pensei em outra opção.

Minha solução usa API privada para acessar o ivar _serviceString do label ( UIStatusBarServiceItemView ) que é exibido na barra de status.

Ele depende da barra de status ter um valor de portadora e só precisa que o UIKit funcione.

 - (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]; } 

Eu só testei o método com aplicativos que têm barra de status visível. Ele retorna a mesma string que é exibida na barra de status, então funciona corretamente mesmo quando estiver em roaming.

Este método não é seguro na App Store.

http://support.apple.com/pt

Existe uma maneira, no entanto, só está disponível no iOS 4, assim você não poderá usá-lo nas versões anteriores. E isso provavelmente quebra sua compatibilidade com versões anteriores também.

Obtenha o nome da operadora na barra de status, caso a Telefonia Nuclear retorne “Transportadora”

 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 } 

Para usuários rápidos, você pode tentar isto:

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