2016-09-23 18 views
2

キャリア、Wi-Fi、3G、および4Gの信号強度をdBmで取得しようとしています。デバイスの信号強度を取得

私は現在このコードを使用して、ステータスバーから通信事業者と無線LANを取得していますが、別の方法またはより良い方法があるかどうかを知りたいと思いますか?また、私は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オブザーバー:iPhone Dev Wiki article on CTIndicatorsから適応

// 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(); 

#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 
} 

は別の関数でハンドラを登録します。

これらのメソッドは、8.4(?)を超えるiOS SDKではなくなりました。それらにアクセスするには、関数と定数をexternにして新しいヘッダ作成:私はあまりにもプライベートAPIを使用

#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'定数と関数をexternする必要がありました。これらの宣言を含めるために私の答えを編集します。 – 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); 

関連する問題