Получение имени оператора с iPhone программным способом - PullRequest
44 голосов
/ 12 мая 2009

Можно ли программно узнать оператора сотовой связи на iPhone?

Я ищу имя оператора, к которому подключен iPhone.

Ответы [ 8 ]

81 голосов
/ 16 октября 2010

В iOS 4 используется платформа CoreTelephony, вот фрагмент кода для получения имени оператора:

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

Ссылка на CoreTelephony и включение в ваши заголовки:

#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <CoreTelephony/CTCarrier.h>
13 голосов
/ 19 мая 2011

Просто чтобы сделать заметку ... Я тестировал этот API на разных SIM-картах, и кажется, что имя оператора, к которому заблокирован iPhone, возвращается с [carrer carrierName] !!

Я проверил это на 2 телефонах, один из которых заблокирован, а другой нет, и для заблокированного, независимо от поставщика SIM-карты, он возвращает имя оператора, для которого заблокирован каждый раз, когда я запускаю тестовое приложение. Обратите внимание, что MNC действительно меняется!

2 голосов
/ 30 января 2018

Получить имя оператора из строки состояния в случае, если Core Telephony возвращает "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 голосов
/ 12 мая 2009

Нет общедоступного API для получения имени оператора. Если вам не нужно публиковаться в App Store, вы можете посмотреть, используя частные API.

VVCarrierParameters.h в пакете VisualVoiceMail, кажется, имеет метод класса carrierServiceName, который может быть тем, что вам нужно. Удалите этот заголовок в свой проект и позвоните [VVCarrierParameters carrierServiceName].

Обратите внимание, что ваше приложение, скорее всего, будет отклонено, если вы сделаете это .

1 голос
/ 01 июня 2015

При разработке Альфа я столкнулся с той же проблемой. Сам проект не ограничивался использованием только публичного API, поэтому сначала я попробовал решение @Jason Harwig. Поскольку я не мог заставить его работать, я подумал о другом варианте.

Мое решение использует частный API для доступа к _serviceString ивару метки (UIStatusBarServiceItemView), отображаемой в строке состояния.

Это зависит от строки состояния, имеющей значение оператора связи, и для работы требуется только 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];
}

Я тестировал метод только с приложениями, у которых отображается строка состояния. Возвращает ту же строку, что и в строке состояния, поэтому работает правильно даже в роуминге.

Этот метод небезопасен в App Store.

0 голосов
/ 02 апреля 2019

Когда вы печатаете вывод носителя? .Description

Вот что вы видите:

[\ "0000000100000001 \": CTCarrier (0x2803a1980) {\ n \ t Имя оператора: [Vodafone] \ n \ tМобильный код страны: [214] \ n \ tМобильный сетевой код: [01] \ n \ tISO Код страны : [es] \ n \ t Разрешить VOIP? [ДА] \ n} \ n]

Отформатировано (\ n и \ t):

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

Так что получить имя оператора из строки состояния - хороший вариант (по крайней мере, для меня)

Я имею в виду ответ пользователя "codethemall".

0 голосов
/ 13 июля 2016

Для быстрых пользователей вы можете попробовать это:

import CoreTelephony

static var carrierName:String? {
    let networkInfo = CTTelephonyNetworkInfo()
    let carrier = networkInfo.subscriberCellularProvider
    return carrier?.carrierName
}
0 голосов
/ 19 августа 2010

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

Существует такой способ, однако он доступен только на iOS 4, поэтому вы не сможете использовать его в предыдущих версиях. И это, вероятно, нарушает вашу обратную совместимость.

...