Измерение уровня сигнала сотовой связи
Я разрабатываю приложение для iOS, не предназначенное для магазина приложений. Я хочу прочитать уровень сигнала сотовой связи в моем коде.
Я знаю, что Apple не предоставляет API, с помощью которого мы можем достичь этого.
Есть ли какой-нибудь частный API, который можно использовать для достижения этой цели? Я просмотрел различные темы по этой проблеме, но не смог найти какую-либо соответствующую информацию.
Это вполне возможно, потому что в магазине приложений есть приложение для определения уровня сигнала оператора.
6 ответов
Я кратко посмотрел на проект VAFieldTest, расположенный на Github.
Кажется, есть getSignalStrength()
а также register_notification()
функции в Classes/VAFieldTestViewController.m, которые могут быть вам интересны при вызове CoreTelephony.framework
,
Я вполне уверен, что некоторые из использованных вызовов недокументированы в документации по инфраструктуре CoreTelephony от Apple и, следовательно, являются частными - любое приложение в AppStore, должно быть, прошло проверку.
Получите сигнал Streght IOS9:
UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
NSString *dataNetworkItemView = nil;
for (id subview in subviews) {
if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]])
{
dataNetworkItemView = subview;
break;
}
}
int signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue];
NSLog(@"signal %d", signalStrength);
Это не очень сложно.
- Ссылка CoreTelephony.framework в вашем проекте XCode
- Добавьте следующие строки, где вам это нужно
Код:
int CTGetSignalStrength(); // private method (not in the header) of Core Telephony
- (void)aScanMethod
{
NSLog(@"%d", CTGetSignalStrength()); // or do what you want
}
И вы сделали.
Обновление май 2016
Apple удалила эту возможность.
Чтобы получить сигнал в iOS 9 или выше в Swift 3, без использования частного API от CoreTelephony - CTGetSignalStrength()
, Просто обыскиваю статусбар вид.
func getSignalStrength() -> Int {
let application = UIApplication.shared
let statusBarView = application.value(forKey: "statusBar") as! UIView
let foregroundView = statusBarView.value(forKey: "foregroundView") as! UIView
let foregroundViewSubviews = foregroundView.subviews
var dataNetworkItemView:UIView!
for subview in foregroundViewSubviews {
if subview.isKind(of: NSClassFromString("UIStatusBarSignalStrengthItemView")!) {
dataNetworkItemView = subview
break
} else {
return 0 //NO SERVICE
}
}
return dataNetworkItemView.value(forKey: "signalStrengthBars") as! Int
}
Внимание: если строка состояния скрыта, клавиша "statusBar" вернет ноль.
Вот ответ Лукаса, преобразованный в Xamarin и протестированный на iOS 10.2.1:
var application = UIApplication.SharedApplication;
var statusBarView = application.ValueForKey(new NSString("statusBar")) as UIView;
var foregroundView = statusBarView.ValueForKey(new NSString("foregroundView")) as UIView;
UIView dataNetworkItemView = null;
foreach (UIView subview in foregroundView.Subviews)
{
if ("UIStatusBarSignalStrengthItemView" == subview.Class.Name)
{
dataNetworkItemView = subview;
break;
}
}
if (null == dataNetworkItemView)
return false; //NO SERVICE
int bars = ((NSNumber)dataNetworkItemView.ValueForKey(new NSString("signalStrengthBars"))).Int32Value;
Я не проверял это, но, видимо, теперь это метод CTTelephonyNetworkInfo
вместо глобальной / статической функции.
Тип возврата id
Я думаю, вы получите либо NSDictionary
(как _cachedSignalStrength
ивар подразумевает) или NSNumber
(как следует из старой функции).
id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength];
Это изменилось в iOS 8.3, как вы можете видеть из коммита.
Обратите внимание, что это все еще не задокументировано! Поэтому, если ваше приложение попадет в App Store, примите меры предосторожности.