Question

Y at-il un moyen de connaître le support de cellules sur un iPhone programme?

Je cherche le nom du transporteur qui l'iPhone est connecté.

Était-ce utile?

La solution

Dans iOS 4, le cadre CoreTelephony est utilisable, voici un extrait pour obtenir le nom du transporteur:

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

Link contre CoreTelephony et inclure dans vos têtes:

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

Autres conseils

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

Je l'ai testé ce sur 2 iphones, un verrouillage et l'autre non, et pour le verrouillage d'un, quel que soit le fournisseur de la carte SIM, il renvoie le nom de l'opérateur, il est verrouillé à chaque fois que je lance mon application de test. A noter cependant que le MNC ne change!

Il n'y a pas d'API publique pour obtenir le nom du transporteur. Si vous n'avez pas besoin de publier, vous pouvez regarder sur l'App Store à l'aide des API privées.

dans le VVCarrierParameters.h paquet semble avoir messagerie vocale visuelle d'une classe carrierServiceName méthode qui pourrait être ce dont vous avez besoin. Laissez tomber cet en-tête dans votre projet et appelez [VVCarrierParameters carrierServiceName].

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

Get nom de l'opérateur de la barre d'état en cas si la téléphonie de base retourne "Transporteur"

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
}

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

Ma solution utilise l'API privée pour accéder au Ivar de l'_serviceString étiquette (UIStatusBarServiceItemView) qui est affiché dans la barre d'état.

Il repose sur la barre d'état ayant une valeur porteuse et n'a besoin que de travailler UIKit.

- (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 ne testé la méthode avec des applications qui ont la barre d'état visible. Il retourne la même chaîne tel qu'il est affiché dans la barre d'état, de sorte qu'il fonctionne correctement, même en cas d'itinérance.

Cette méthode est sûre App Store.

https://developer.apple.com/iphone/prerelease/library/documentation/NetworkingInternet/Reference/CTCarrier/Reference/Reference.html#//apple_ref/doc/uid/TP40009596-CH1 -DontLinkElementID_3

Il y a une telle manière mais il est disponible uniquement sur iOS 4 afin que vous ne pourrez pas l'utiliser sur les versions précédentes. Et cela va probablement casser votre compatibilité ascendante aussi.

Pour les utilisateurs rapides, vous pouvez essayer ceci:

import CoreTelephony

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

Lorsque vous imprimez la sortie de la porteuse? .Description

Voici ce que vous voyez:

[\ "0000000100000001 \": CTCarrier (0x2803a1980) {\ n \ nom de tCarrier: [Vodafone] \ n \ TMobile Code du pays: [214] \ n \ TMobile Network Code: [01] \ n \ Tiso Code du pays : [es] \ n \ Tallows VOIP? [OUI] \ n} \ n]

en forme (\ n et \ t):

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

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

Je veux dire la réponse utilisateur "codethemall".

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