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