Есть ли способ узнать сотовый оператор на iPhone программно?Получение имени несущей с iPhone программно
** Обновление **
Я ищу имя носителя которого iPhone подключен.
Есть ли способ узнать сотовый оператор на iPhone программно?Получение имени несущей с iPhone программно
** Обновление **
Я ищу имя носителя которого iPhone подключен.
В прошивке 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>
Согласно документации Apple, это всегда дает вам информацию о вашем носителе honme, а не о том, с кем вы в данный момент подключены в роуминге. – phoenies
Не забудьте поставить '#import
Добавить #import
Для получения названия перевозчика нет открытого API. Если вам не нужно публиковать в App Store, вы можете посмотреть на использование private api.
VVCarrierParameters.h
В пакете VisualVoiceMail, похоже, есть метод класса carrierServiceName
, который может быть тем, что вам нужно. Снимите этот заголовок в своем проекте и вызовите [VVCarrierParameters carrierServiceName]
.
Примечание. Ваше приложение, скорее всего, будет отклонено, если вы сделаете это.
Существует эдакий способ, однако он доступен только на 4 прошивке, так что вы не сможете использовать его в предыдущих версиях. И это, вероятно, также нарушает вашу обратную совместимость.
Просто, чтобы сделать Обратите внимание, здесь. Я тестировал этот API на разных SIM-картах, и кажется, что имя оператора iPhone заблокировано, возвращается с [carrer carrierName] !!
Я тестировал это на 2 iphones, один заперт, а другой нет, а для заблокированного, независимо от поставщика SIM-карты, он возвращает имя оператора, в котором он заблокирован, каждый раз, когда я запускаю тестовое приложение. Обратите внимание, однако, что MNC действительно меняется!
Хороший комментарий. Я не знал об этом, пока не увидел этот ответ. Могу подтвердить, что я получаю такое же поведение - carrierName возвращает заблокированное имя несущей, а не несущую SIM. –
Протестировано на iOS 7, разблокирован телефон: всегда возвращается «Перевозчик» msgstr "Невозможно правильно определить, какой оператор находится в телефоне. rned равно строке, отображаемой в Настройках -> Общие -> О программе под Carrier. Однако номер версии теряется. – Legoless
Это правильно. MNC является единственным точным тестом на перевозку от CTCarrier. Мы также кэшируем значение MNC, так как оно будет возвращать нуль, если пользователь не имеет сетевого подключения, находится в режиме самолета или удалил свою SIM-карту. – NSAlexC
При разработке 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];
}
Я только протестировал метод с приложениями, которые имеют видимую строку состояния. Он возвращает ту же строку, что и в строке состояния, поэтому работает корректно даже при роуминге.
Этот метод не является безопасным для магазина приложений.
Для быстрых пользователей, вы можете попробовать это:
import CoreTelephony
static var carrierName:String? {
let networkInfo = CTTelephonyNetworkInfo()
let carrier = networkInfo.subscriberCellularProvider
return carrier?.carrierName
}
Получить имя носителя из строки состояния в случае, если основная Телефония возвращает «Перевозчик»
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
}
Что вы имеете в виду есть iPhone носители, отличные от AT & T? –
Вы говорите о том, с каким телефоном в данный момент подключен телефон (т. Е. Может быть роуминг), или с какого оператора вы получаете счета? – crashmstr
Возможно, вы не слышали об этом, но есть и другие страны мира. И что интересно, у них есть мобильные технологии. – mentat