Измерение уровня сигнала сотовой связи

Я разрабатываю приложение для 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);

Это не очень сложно.

  1. Ссылка CoreTelephony.framework в вашем проекте XCode
  2. Добавьте следующие строки, где вам это нужно

Код:

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, примите меры предосторожности.

Другие вопросы по тегам