2009-05-12 6 views
41

Есть ли способ узнать сотовый оператор на iPhone программно?Получение имени несущей с iPhone программно

** Обновление **

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

+5

Что вы имеете в виду есть iPhone носители, отличные от AT & T?

+0

Вы говорите о том, с каким телефоном в данный момент подключен телефон (т. Е. Может быть роуминг), или с какого оператора вы получаете счета? – crashmstr

+12

Возможно, вы не слышали об этом, но есть и другие страны мира. И что интересно, у них есть мобильные технологии. – mentat

ответ

76

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

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

Link против CoreTelephony и включает в заголовках:

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

Согласно документации Apple, это всегда дает вам информацию о вашем носителе honme, а не о том, с кем вы в данный момент подключены в роуминге. – phoenies

+5

Не забудьте поставить '#import ' на – zekel

+7

Добавить #import в противном случае он покажет предупреждение о том, что метод carrierName не найден. – HarshIT

2

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

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

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

+0

. Как исправить ошибку «Символы (не)» при связывании? Спасибо – ohho

+0

К сожалению, этот метод всегда возвращает нуль для меня. :( – Legoless

0

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

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

10

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

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

+1

Хороший комментарий. Я не знал об этом, пока не увидел этот ответ. Могу подтвердить, что я получаю такое же поведение - carrierName возвращает заблокированное имя несущей, а не несущую SIM. –

+0

Протестировано на iOS 7, разблокирован телефон: всегда возвращается «Перевозчик» msgstr "Невозможно правильно определить, какой оператор находится в телефоне. rned равно строке, отображаемой в Настройках -> Общие -> О программе под Carrier. Однако номер версии теряется. – Legoless

+0

Это правильно. MNC является единственным точным тестом на перевозку от CTCarrier. Мы также кэшируем значение MNC, так как оно будет возвращать нуль, если пользователь не имеет сетевого подключения, находится в режиме самолета или удалил свою SIM-карту. – NSAlexC

1

При разработке Alpha, я столкнулся с той же проблемой. Сам проект не ограничивался использованием только публичного 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]; 
} 

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

Этот метод не является безопасным для магазина приложений.

0

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

import CoreTelephony 

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

Получить имя носителя из строки состояния в случае, если основная Телефония возвращает «Перевозчик»

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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^