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.
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 }