web-dev-qa-db-fra.com

Récupération du nom de l'opérateur sur iPhone par programme

Existe-t-il un moyen de connaître le support de cellule sur un iPhone par programmation?

Je recherche le nom de l'opérateur auquel l'iPhone est connecté.

44
thierryb

Dans iOS 4, le framework CoreTelephony est utilisable, voici un extrait pour obtenir le nom de l'opérateur:

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

Liez contre CoreTelephony et incluez dans vos en-têtes:

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>
82
George Zhu

Juste pour faire une note ici .. J'ai testé cette API sur différentes SIM et il semble que le nom de l'opérateur sur lequel l'iPhone est verrouillé soit retourné avec [carrer carrierName] !!

J'ai testé cela sur 2 iphones, l'un verrouillé et l'autre non, et pour celui verrouillé, quel que soit le fournisseur de la carte SIM, il renvoie le nom de l'opérateur auquel il est verrouillé chaque fois que j'exécute mon application de test. Notez cependant que le MNC change!

15
Abolfoooud

Obtenez nom de l'opérateur à partir de la barre d'état dans le cas où Core Telephony renvoie "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
}
2
codethemall

Il n'y a pas d'API publique pour obtenir le nom de l'opérateur. Si vous n'avez pas besoin de publier sur l'App Store, vous pouvez envisager d'utiliser des API privées.

VVCarrierParameters.h dans le package VisualVoiceMail semble avoir une méthode de classe carrierServiceName qui pourrait être ce dont vous avez besoin. Déposez cet en-tête dans votre projet et appelez [VVCarrierParameters carrierServiceName].

Notez que votre application sera très probablement rejetée si vous faites cela .

2
Jason Harwig

Pour les utilisateurs de Swift, vous pouvez essayer ceci:

import CoreTelephony

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

Lors du développement Alpha , j'ai rencontré le même problème. Le projet lui-même ne se limitait pas à utiliser uniquement une API publique, j'ai donc d'abord essayé la solution de @Jason Harwig. Parce que je ne pouvais pas le faire fonctionner, j'ai pensé à une autre option.

Ma solution utilise une API privée pour accéder à _serviceString ivar de l'étiquette (UIStatusBarServiceItemView) qui s'affiche dans la barre d'état.

Il repose sur une barre d'état ayant une valeur de transporteur et n'a besoin que de UIKit pour fonctionner.

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

Je n'ai testé la méthode qu'avec des applications dont la barre d'état est visible. Il retourne la même chaîne que celle affichée dans la barre d'état, donc il fonctionne correctement même en itinérance.

Cette méthode n'est pas sûre sur l'App Store.

1
Legoless

https://developer.Apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//Apple_ref/doc/uid/TP40009596-CH1-DontLinkElementID_

Il existe un tel moyen, mais il n'est disponible que sur iOS 4, vous ne pourrez donc pas l'utiliser sur les versions précédentes. Et cela rompt probablement aussi votre rétrocompatibilité.

0
radalin

Lorsque vous imprimez la sortie du support? .Description

Voici ce que vous voyez:

[\ "0000000100000001 \": CTCarrier (0x2803a1980) {\ n\tNom du transporteur: [Vodafone]\n\tCode pays mobile: [214]\n\tCode réseau mobile: [01]\n\tISO Code pays: [es ]\n\tPermet VOIP? [OUI]\n}\n]

Formaté (\ n et\t):

[\"0000000100000001\": CTCarrier (0x2803a1980) {
    Carrier name: [Vodafone]
    Mobile Country Code: [214]
    Mobile Network Code:[01]
    ISO Country Code:[es]
    Allows VOIP? [YES]
}
]

Donc, obtenir le nom du transporteur à partir de la barre d'état est une bonne option (au moins pour moi)

Je veux dire la réponse de l'utilisateur "codethemall".

0
Markus