Domanda

Sto lavorando su un'applicazione per iPhone e vorrei davvero per determinare se il dispositivo è in roaming in modo che possa intelligentemente evitare che costano i miei utenti connessioni costose se fuori della loro rete domestica.

L'applicazione che sto scrivendo è per i telefoni jailbroken, però io preferirei usare SDK standard, se possibile.

Ecco quello che ho già trovato:

1. SDK Apple: Nella documentazione di Apple, ho trovato la promessa di API SCNetworkReachability di Apple. L'API fornisce l'accesso a cose come se siete su una connessione WiFi o una rete cellulare, sia di una connessione di rete è attualmente stabilita, ecc, tuttavia la ricerca del pdf di riferimento SCNetworkReachability API per 'roam' o 'di roaming' sia alzare nullo. Così fa il loro codice di esempio.

2. Grep di un iPhone Jailbroken FS: Le preferenze -> Generale -> scheda di rete è dove gli utenti possono attivare o disattivare il roaming loro. Guardando nel file plist per questo ( "/Applications/Preferences/Network.plist") sono stato in grado di trovare i seguenti riferimenti:

        PostNotification = "com.apple.commcenter.InternationalRoamingEDGE.changed";
        cell = PSSwitchCell;
        default = 1;
        defaults = "com.apple.commcenter";
        key = InternationalRoamingEDGE;
        label = "EDGE_ROAMING_TOGGLE";
        requiredCapabilities =             (
            telephony
        );

Questo è certamente un vantaggio, così come appare posso firmare per le notifiche che l'utente ha modificato le impostazioni InternationalRoaming. Eppure, io non sono certo come trasformare questo nella consapevolezza che essi sono in realtà, attualmente in roaming.

3. Verificare la classe scaricato fonti di SpringBoard: Ho scaricato le classi di SpringBoard utilizzando classe-dump . Non sono riuscito a trovare alcun riferimento a 'vagare' o 'di roaming'

4. Ovviamente ho iniziato controllando a SO per questo: Impossibile trovare tutto ciò che riguarda.

Ulteriori passi: Qualcuno ha qualche consiglio qui? So che questo è possibile. Apple ha chiaramente ha reso molto difficile trovare comunque. Ho molto dubbio questo è possibile senza utilizzare un framework privato. (Come CoreTelephony). Poiché si tratta di un app jailbroken, io possono ricorrere a screen-scraping il il nome del gestore con il codice inserito nella SpringBoard, ma vorrei davvero piuttosto preferiscono non seguire questa strada. Qualche consiglio molto apprezzato. Grazie.

È stato utile?

Soluzione

Non è! Non è documentato a tutti, e dubito fortemente questo dovrebbe funzionare su un telefono non jailbroken (in quanto richiede l'utilizzo di file non nella sandbox). Tuttavia, ecco come si fa.

Il file iPhone sistema mantiene due softlink:

static NSString *carrierPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.carrier.plist";
static NSString *operatorPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.operator.plist";

quando questi collegamenti sono rivolte l'una verso lo stesso file, il telefono non è in roaming. Quando si punta a file diversi, il telefono è romaing.

codice semplificato (senza controllo degli errori, ecc):

- (BOOL)isRoaming
{
    NSFileManager *fm = [NSFileManager defaultManager];
    NSError *error;
    NSString *carrierPListPath = [fm destinationOfSymbolicLinkAtPath:carrierPListSymLinkPath error:&error];
    NSString *operatorPListPath = [fm destinationOfSymbolicLinkAtPath:operatorPListSymLinkPath error:&error];
    return (![operatorPListPath isEqualToString:carrierPListPath]);
}

Altri suggerimenti

la soluzione dei link simbolici non sono l'unico modo per farlo, ma sicuramente è il migliore. Come ho appena realizzato, le stringhe restituito contiene i codici MCC e MNC dell'operatore e il supporto !!! Anche il quadro core della fonia non è in grado di recuperare quelle informazioni che l'operatore il vostro iPhone è collegato, quando in di roaming.

 Logs: 
 carrier: /System/Library/Carrier Bundles/iPhone/72410/carrier.plist
 operator: /System/Library/Carrier Bundles/iPhone/20810/carrier.plist

Come si può vedere, il vettore (originale fornitore di cellulari) riga contiene il file all'interno del 72410 "cartella", il che significa MCC 724 (Brasile) e MNC 10 (VIVO). L'operatore (in realtà il telefono una mia cella è collegata la società - sono in roaming). Si trova all'interno della cartella 20810, il che significa MCC 208 (Francia) e MNC 10 (SFR)

A proposito, sto usando iPhone 4 con iOS5.

In un dispositivo non-jailbreak è possibile utilizzare servizi di terze parti come http://ipinfo.io (il mio proprio servizio ) per scoprire il paese attuale, anche il codice vettore in base all'indirizzo IP del dispositivo, e si può quindi confrontare che al CTCarrier dettagli per determinare se il dispositivo è in roaming. Ecco la risposta ipinfo.io API standard:

$ curl ipinfo.io/24.32.148.1 
{
    "ip": "24.32.148.1",
    "hostname": "doc-24-32-148-1.pecos.tx.cebridge.net",
    "city": "Pecos",
    "region": "Texas",
    "country": "US",
    "loc": "31.3086,-103.5892",
    "org": "AS7018 AT&T Services, Inc.",
    "postal": "79772"
}

I pacchetti personalizzati sono disponibili che includono anche i dettagli MNC / mcc di indirizzi IP mobili però. per ulteriori informazioni, vedere http://ipinfo.io/developers .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top