it-swarm.com.ru

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

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

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

Есть ли какой-нибудь частный API, который можно использовать для достижения этой цели? Я просмотрел различные темы по этой проблеме, но не смог найти какую-либо соответствующую информацию.

Это вполне возможно, потому что в магазине приложений есть приложение для определения уровня сигнала оператора.

27
bhatti

Я кратко посмотрел на проект VAFieldTest, расположенный в Github .

Кажется, в классах/VAFieldTestViewController.m есть функции getSignalStrength() и register_notification(), которые могут быть вам интересны при вызове CoreTelephony.framework

Я совершенно уверен, что некоторые из используемых вызовов недокументированы в документации по инфраструктуре CoreTelephony от Apple и, следовательно, являются частными - любое приложение в AppStore должно быть прошло проверку. 

9
Niels Castle

Получите сигнал 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);
14
vualoaithu

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

  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 удалила эту возможность.

10
Michael Dorner

Чтобы получить сигнал в 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» вернет ноль.

5
Lucas Freitas de Oliveira

Я не проверял это, но, по-видимому, теперь это метод CTTelephonyNetworkInfo вместо глобальной/статической функции.

Тип возвращаемого значения - id, поэтому я думаю, что вы получите либо NSDictionary (как предполагает _cachedSignalStrength ivar), либо NSNumber (как и старая функция).

id signalStrength = [[CTTelephonyNetworkInfo new] signalStrength];

Это изменилось в iOS 8.3, как вы можете видеть из commit .

Обратите внимание, что это все еще не задокументировано! Поэтому, если ваше приложение попадет в App Store, примите меры предосторожности.

1
Alessandro Vendruscolo

Вот ответ Лукаса, преобразованный в 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;
0
Eliot Gillum