2016-09-23 10 views
2

Я пытаюсь получить силу сигнала в дБм для носителя, Wi-Fi, 3g и 4g.Получить сигнал сигнала устройства

В настоящее время я использую этот код, чтобы получить статус оператора и Wi-Fi в строке состояния, и я хотел бы узнать, есть ли другой способ или лучший способ? Также как я мог получить его для 3g и 4g?

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; 
NSString *dataNetworkItemView = nil; 
NSString *wifiNetworkItemView = nil; 

for (id subview in subviews) { 
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) { 
     dataNetworkItemView = subview; 
    } 
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { 
     wifiNetworkItemView = subview; 
    } 
} 

int carrierSignalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue]; 
int wifiSignalStrength = [[wifiNetworkItemView valueForKey:@"wifiStrengthRaw"] intValue]; 

Не имеет значения, какие-либо методы, которые я использую, являются частными или нет.

ответ

2

Использование CoreTelephony и CTTelephonyCenter наблюдатели:

#include <CoreTelephony/CoreTelephony.h> 

// Event handler 
static void SignalStrengthDidChange(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) 
{ 
    long int raw = 0; 
    long int graded = 0; 
    long int bars = 0; 

    CTIndicatorsGetSignalStrength(&raw, &graded, &bars); 

    printf("Signal strength changed! Raw: %li, graded: %li bars: %li\n", raw, graded, bars); 
    // Prints something like: 
    // Signal strength changed! Raw: -96, graded: 27 bars: 3 
} 

Регистрация обработчика в другой функции:

// Register as a listener to the kCTIndicatorsSignalStrengthNotification notification to be notified when the signal strength changed. 
CTTelephonyCenterAddObserver(CTTelephonyCenterGetDefault(), NULL, SignalStrengthDidChange, kCTIndicatorsSignalStrengthNotification, NULL, CFNotificationSuspensionBehaviorCoalesce); 

// Get the initial strength. 
SignalStrengthDidChange(); 

CFRunLoopRun(); 

Адаптированные из iPhone Dev Wiki article on CTIndicators.

Эти методы больше не находятся в каких-либо SDK для iOS, превышающих 8,4 (?) Я считаю. Для того, чтобы получить доступ к ним, создайте новый заголовок с к Экстерн функции и констант:

#include <CoreFoundation/CoreFoundation.h> 

#if __cplusplus 
extern "C" { 
#endif 

#pragma mark - API 

    /* This API is a mimic of CFNotificationCenter. */ 

    CFNotificationCenterRef CTTelephonyCenterGetDefault(); 
    void CTTelephonyCenterAddObserver(CFNotificationCenterRef center, const void *observer, CFNotificationCallback callBack, CFStringRef name, const void *object, CFNotificationSuspensionBehavior suspensionBehavior); 
    void CTTelephonyCenterRemoveObserver(CFNotificationCenterRef center, const void *observer, CFStringRef name, const void *object); 
    void CTTelephonyCenterRemoveEveryObserver(CFNotificationCenterRef center, const void *observer); 

    void CTIndicatorsGetSignalStrength(long int *raw, long int *graded, long int *bars); 

#pragma mark - Definitions 

    /* For use with the CoreTelephony notification system. */ 
    extern CFStringRef kCTIndicatorsSignalStrengthNotification; 

#if __cplusplus 
} 
#endif 
+0

Спасибо! И как вы считаете, это считается частным? Потому что было бы еще лучше, если бы это было бы приемлемо для appStore – razvan

+2

Это, безусловно, частный API. Чтобы получить это для компиляции на современном SDK, мне пришлось вручную вывести некоторые из констант и функций CoreTelephony. Я отредактирую свой ответ, чтобы включить эти объявления. – JAL

0

Я тоже использовать частные интерфейсы .. Но я получаю эту силу сигнала от (видимой) Строки состояния.

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; 
NSString *dataNetworkItemView = nil; 
NSString *signalStrengthView = nil; 

for (id subview in subviews) { 
    NSLog(@"Class - %@", NSStringFromClass([subview class])); 

    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) { 
     signalStrengthView = subview; 
    } 

    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { 
     dataNetworkItemView = subview; 
    } 
} 

int signalStrength = [[signalStrengthView valueForKey:@"signalStrengthRaw"] intValue]; 
NSLog(@"signal %d", signalStrength); 

int wifiStrength = [[dataNetworkItemView valueForKey:@"wifiStrengthRaw"] intValue]; 
NSLog(@"wifi %d", wifiStrength); 

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^