Question

Je travaille sur une application iPhone et voudrais vraiment déterminer si l'appareil est en itinérance afin que je puisse éviter intelligemment mes coûts utilisateurs des connexions coûteuses si de leur réseau domestique.

L'application que je suis en train d'écrire est pour les téléphones jailbreakés, mais je préférerais utiliser SDKs standard si possible.

Voici ce que je l'ai déjà trouvé:

1. Apple SDKs: Dans la documentation de pomme, j'ai trouvé la promesse dans l'API SCNetworkReachability d'Apple. L'API donne accès à des choses telles que si vous êtes sur une connexion WiFi ou un réseau de téléphonie cellulaire, si une connexion réseau est actuellement mis en place, etc. recherche Cependant la référence API SCNetworkReachability pdf pour « Roam » ou « itinérance » à la fois se présenter nulle. Il en va de leur code exemple.

2. Grep d'un iPhone jailbreaké FS: Les préférences -> Général -> onglet réseau est où les utilisateurs peuvent activer ou désactiver leur itinérance. En regardant dans le fichier plist pour cela ( « /Applications/Preferences/Network.plist »), j'ai pu trouver les références suivantes:

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

Ceci est certainement une avance, car il semble que je peux vous inscrire pour les notifications que l'utilisateur a modifié les paramètres de InternationalRoaming. Pourtant, je ne suis pas certain comment transformer cela en sachant qu'ils sont en fait, l'itinérance actuellement.

3. Vérifiez la classe de sources sous-évaluées SpringBoard: J'ai largué les classes de SpringBoard en utilisant classe décharge. Je ne pouvais pas trouver toutes les références à « Roam » ou « roaming »

4. Il est évident que j'ai commencé par vérifier à SO pour cela: Impossible de trouver quoi que ce soit lié.

D'autres étapes: Quelqu'un at-il des conseils ici? Je sais que cela est possible. Apple a clairement fait qu'il est très difficile de trouver cependant. Je doute fortement que cela est possible sans utiliser un cadre privé. (Comme CoreTelephony). Comme cela est une application jailbreaké, je station à écran racler le nom porteuse avec le code injecté dans le SpringBoard, mais je préférerais vraiment ne pas aller dans cette voie. Des conseils très appréciés. Merci.

Était-ce utile?

La solution

Il y a! Il est pas documenté du tout, et je doute fortement cela fonctionnerait sur un téléphone non-jailbreaké (car elle nécessite l'utilisation de fichiers non dans le bac à sable). Cependant, voici comment il est fait.

Le système de fichiers iPhone conserve deux liens logiciels:

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

lorsque ces liens pointent dans le même fichier, le téléphone est hors itinérance. Lorsque vous pointez sur différents fichiers, le téléphone est romaing.

Code simplifié (pas de vérification d'erreur, etc.):

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

Autres conseils

la solution des liens symboliques ne sont pas la seule façon de le faire, mais sans aucun doute il est le meilleur. Comme je viens de réaliser, les chaînes retourné contient les codes MCC et MNC de l'opérateur et transporteur !!! Même le cadre de la téléphonie de base ne sont pas en mesure de récupérer les informations sur l'opérateur de votre iPhone est connecté lorsqu'il est en itinérance.

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

Comme vous pouvez le voir, la ligne porteuse (fournisseur de téléphonie cellulaire d'origine) contient le fichier dans le « dossier » 72410, ce qui signifie MCC 724 (Brésil) et MNC 10 (VIVO). L'opérateur (en fait celui que mon téléphone portable est connecté maintenant - je suis en itinérance). Est dans le dossier 20810, ce qui signifie MCC 208 (France) et MNC 10 (SFR)

Par ailleurs, j'utilise iPhone 4 avec iOS5.

Sur un périphérique non jailbreak, vous pouvez utiliser des services tiers comme http://ipinfo.io (mon propre service ) pour connaître le pays actuel du même code de transporteur basé sur l'adresse IP de l'appareil, et vous pouvez alors comparer à la CTCarrier les détails pour déterminer si l'appareil est en itinérance. Voici la réponse standard API ipinfo.io:

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

packages personnalisés sont disponibles qui comprennent également les détails RNM / mcc des adresses IP mobiles cependant. Voir http://ipinfo.io/developers pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top