2009-05-12 17 views
41

Esiste un modo per conoscere programmaticamente il corriere su un iPhone?Recupero nome operatore da iPhone a livello di programmazione

** Aggiornamento **

Sto cercando il nome del gestore, che l'iPhone è collegato.

+5

cosa, vuoi dire ci sono iPhone vettori diversi da AT & T?

+0

Stai parlando di chi è il servizio al quale il telefono è attualmente connesso (ad esempio potrebbe essere il roaming) o chi è il gestore da cui ricevi le fatture? – crashmstr

+12

Potresti non averne sentito parlare, ma ci sono altri paesi nel mondo. E, cosa interessante, hanno la tecnologia mobile. – mentat

risposta

76

In iOS 4, il quadro CoreTelephony è utilizzabile, ecco un frammento di ottenere il nome del gestore:

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

Link contro CoreTelephony e includere nelle intestazioni:

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

Secondo la documentazione di Apple, questo ti dà sempre informazioni sul tuo operatore honme, non sul corriere al quale sei attualmente connesso durante il roaming. – phoenies

+5

Non dimenticare di inserire '#import ' al parte del file. – zekel

+7

Aggiungi #import altrimenti verrà visualizzato un avviso che "metodo carrierName non trovato" . – HarshIT

2

Non esiste alcuna API pubblica per ottenere il nome del gestore. Se non è necessario pubblicare su App Store, è possibile utilizzare le API private.

VVCarrierParameters.h nel pacchetto VisualVoiceMail sembra avere un metodo di classe carrierServiceName che potrebbe essere quello che ti serve. Rilascia l'intestazione nel tuo progetto e chiama [VVCarrierParameters carrierServiceName].

Nota che la tua app verrà rifiutata molto probabilmente se lo fai.

+0

Come risolvere l'errore 'Simboli (s) non trovati' durante il collegamento? Grazie – ohho

+0

Purtroppo questo metodo restituisce sempre nulla per me. :( – Legoless

10

Giusto per fare un nota qui .. Ho testato questa API su diverse SIM e sembra che il nome dell'operatore a cui è bloccato iPhone sia restituito con [carrer carrierName] !!

L'ho provato su 2 iPhone, uno bloccato e l'altro no, e per quello bloccato, indipendentemente dal provider SIM, restituisce il nome dell'operatore a cui è bloccato ogni volta che eseguo la mia app di test. Si noti tuttavia che il MNC cambia!

+1

Buon commento Non ne sono a conoscenza fino a quando non ho visto questa risposta Posso confermare che sto ottenendo lo stesso comportamento: il carrierName restituisce il nome dell'operatore bloccato, non il gestore SIM. –

+0

Testato su iOS 7, telefono sbloccato: restituisce sempre "Carrier "come carrierName. Quindi non è possibile capire correttamente quale operatore è nel telefono rned è uguale alla stringa visualizzata in Impostazioni -> Generale -> Informazioni su Gestore. Il numero di versione è stato perso, tuttavia. – Legoless

+0

Questo è corretto. MNC è l'unico test accurato del corriere di CTCarrier. Memorizziamo anche il valore MNC, poiché restituirà zero se l'utente non ha una connessione di rete, è in modalità aereo o ha rimosso la SIM. – NSAlexC

1

Durante lo sviluppo di Alpha, ho riscontrato lo stesso problema. Il progetto stesso non si limitava a utilizzare solo API pubbliche, quindi per prima cosa ho provato la soluzione di @Jason Harwig. Perché non riuscivo a farlo funzionare, ho pensato a un'altra opzione.

mia soluzione utilizza API privato per accedere alla _serviceString Ivar dell'etichetta (UIStatusBarServiceItemView) che viene visualizzato nella barra di stato.

Si basa sulla barra di stato con un valore di portante e ha solo bisogno di UIKit per funzionare.

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

Ho testato solo il metodo con le applicazioni con barra di stato visibile. Restituisce la stessa stringa che viene visualizzata nella barra di stato, quindi funziona correttamente anche in roaming.

Questo metodo non è sicuro in App Store.

0

Per gli utenti veloci si può provare questo:

import CoreTelephony 

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

ottenere il nome vettore dalla barra di stato nel caso se Nucleo Telefonia restituisce "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 
} 
Problemi correlati