Domanda

C'è un modo per sapere il vettore cellulare su un iPhone di programmazione?

Sto cercando il nome del gestore, che l'iPhone è collegato.

È stato utile?

Soluzione

In iOS 4, il quadro CoreTelephony è utilizzabile, ecco un frammento di ottenere il nome del gestore:

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

Link contro CoreTelephony e includere nelle intestazioni:

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

Altri suggerimenti

Solo per fare una nota qui .. Ho testato questa API su diverse SIM e sembra che il nome del gestore l'iPhone è bloccato è tornato con [Carrer CARRIERNAME] !!

Ho provato questo su 2 iPhone, uno bloccato e l'altra no, e per l'bloccato uno, indipendentemente dal fornitore di SIM, restituisce il nome dell'operatore è bloccato a ogni ho eseguito il mio test app. Si noti tuttavia che la MNC non cambia!

Non v'è alcuna API pubblica per ottenere il nome del gestore. Se non è necessario pubblicare su App Store si poteva guardare utilizzando API private.

VVCarrierParameters.h nel pacchetto VisualVoiceMail sembra avere una classe carrierServiceName metodo che potrebbe essere quello che ti serve. Goccia che intestazione nel progetto e chiamare [VVCarrierParameters carrierServiceName].

Nota la vostra applicazione sarà molto probabilmente respinta se fate questo .

Get nome carrier dalla barra di stato nel caso se Nucleo Telefonia restituisce "Vettore"

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
}

Durante lo sviluppo Alpha , ho incontrato lo stesso problema. Il progetto in sé non è limitato a utilizzare solo API pubblica, quindi prima ho provato la soluzione di @ Jason Harwig. Perché io non sono riuscito a farlo funzionare, ho pensato a un'altra opzione.

La mia soluzione utilizza API privato per accedere alla _serviceString Ivar dell'etichetta (UIStatusBarServiceItemView) che viene visualizzato nella barra di stato.

Si basa su barra di stato per un valore portante e ha solo bisogno di lavorare 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];
}

ho provato solo il metodo con le applicazioni che dispongono di barra di stato visibile. Esso restituisce la stessa stringa come viene visualizzato nella barra di stato, quindi funziona correttamente anche durante il roaming.

Questo metodo non è App Store al sicuro.

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

C'è un modo però è disponibile solo su iOS 4 in modo da non essere in grado di utilizzarlo su versioni precedenti. E questo probabilmente spezza il retrocompatibilità troppo.

Per gli utenti veloci si può provare questo:

import CoreTelephony

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

Quando si stampa l'uscita del vettore? .Description

Questo è ciò che si vede:

[\ "0000000100000001 \": CTCarrier (0x2803a1980) {\ n \ nome tCarrier: [Vodafone] \ n \ tMobile Codice Paese: [214] \ n \ tMobile Codice di rete: [01] \ n \ Tiso Country Code : [es] \ n \ Tallows VOIP? [YES] \ n} \ n]

formattato (\ ne \ t):

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

Quindi, ottenere il nome dal vettore barra di stato è una buona opzione (almeno per me)

Voglio dire la risposta di utente "codethemall".

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