Frage

ich auf einer iPhone Anwendung arbeitete und würde wirklich zu bestimmen, wie wenn das Gerät Roaming ist so, dass ich intelligent vermeiden kann meine Nutzer teure Verbindungen, wenn aus ihrem Heimnetz koste.

Die Anwendung, die ich für jailbroken Telefone schreibe, aber ich würde Standard-SDKs, wenn möglich bevorzugen.

Hier ist, was ich habe schon gefunden:

1. Apple-SDKs: In der Apple-Dokumentation fand ich das Versprechen in Apples SCNetworkReachability API. Die API ermöglicht den Zugriff auf solche Dinge wie, ob Sie auf einem WiFi oder ein Mobilfunknetz, ob eine Netzwerkverbindung zur Zeit hergestellt wird, usw. Jedoch die SCNetworkReachability API-Referenz pdf Suche nach ‚roam‘ oder ‚Roaming‘ sowohl aufdrehen Null. Das Gleiche gilt für ihren Beispielcode.

2. Grep eines Jailbroken iPhone FS: Die Einstellungen -> Allgemein -> Registerkarte Netzwerk ist in dem Benutzer ein oder aus ihr Roaming drehen kann. Suchen Sie in der plist-Datei für diese ( „/Applications/Preferences/Network.plist“) konnte ich die folgenden Referenzen finden:

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

Dies ist sicherlich eine Führung, wie es ich für Benachrichtigungen anmelden können scheint, dass der Benutzer die InternationalRoaming Einstellungen geändert hat. Trotzdem bin ich nicht sicher, wie dies in dem Wissen zu verwandeln, die sie in der Tat, derzeit Roaming.

3. Überprüfen Sie die Klasse Quellen Spring abgeladen: Ich habe die Klassen von Springboard mit Klasse-dump abgeladen. Ich konnte nicht alle Verweise auf ‚Roam‘ zu finden oder ‚Roaming‘

4. Offensichtlich habe ich angefangen, indem SO für diese Prüfung: Kann nichts verwandte finden.

Weitere Schritte: Hat jemand einen Rat hat hier? Ich weiß, dass dies möglich ist. Apple klar ist es sehr schwierig macht jedoch zu finden. Ich bezweifle stark, dies ist möglich, ohne ein eigenes Framework. (Wie CoreTelephony). Da dies ein jailbroken App ist, kann ich auf Screen-Scraping greife in der Springboard das die Trägernamen mit injizierte Code, aber ich würde wirklich liebes vorziehen, nicht diesen Weg zu gehen. Jede Beratung sehr geschätzt. Danke.

War es hilfreich?

Lösung

Es ist! Es ist nicht dokumentiert, und ich bezweifle stark, dies auf einem Nicht-jailbroken Telefon funktionieren würde (wie es von Dateien mit nicht in der Sandbox erfordert). Aber hier ist, wie es gemacht wird.

Das iPhone-Dateisystem hält zwei Softlinks:

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

, wenn diese Verbindungen in der gleichen Datei verweisen, wird das Telefon Roaming nicht. Wenn bei verschiedenen Dateien zeigt, das Telefon romaing.

Vereinfachte Code (keine Fehlerprüfung, usw.):

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

Andere Tipps

Die Lösung der Symlinks ist nicht der einzige Weg, es zu tun, aber auf jeden Fall ist es die beste. Wie ich gerade festgestellt, kehrten die Strings, die MCC und MNC-Codes des Betreibers und Träger enthält !!! Auch der Kern-Telefonie Rahmen nicht in der Lage ist, diese Informationen über den Betreiber iPhone abgerufen werden, wenn im Roaming angebracht ist.

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

Wie Sie sehen können, der Träger (Original Mobilfunkanbieter) Zeile enthält die Datei im „Ordner“ 72.410, was bedeutet, MCC 724 (Brasilien) und MNC 10 (VIVO). Der Betreiber (eigentlich denjenigen mein Handy jetzt angebracht ist - i in Roaming-bin). Ist im Ordner 20810, was bedeutet, MCC 208 (Frankreich) und MNC 10 (SFR)

By the way, ich bin mit iPhone 4 mit iOS5.

Auf einem Nicht-jailbreak Gerät, das Sie Dienste von Drittanbietern wie http://ipinfo.io (meine eigenen Service ) den aktuellen Land sogar Carrier Code auf dem Gerät die IP-Adresse basiert, um herauszufinden, und Sie können dann, dass im Vergleich zu den CTCarrier zu bestimmen, Details, wenn das Gerät Roaming. Hier ist die Standard-API ipinfo.io Antwort:

$ 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"
}

Benutzerdefinierte Pakete zur Verfügung, die auch die MNC / mcc Details der mobilen IP-Adressen obwohl umfassen. Siehe http://ipinfo.io/developers .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top