获得设备信号强度

我试图获得载波,wifi,3g和4g的dBm信号强度。

我目前正在使用此代码从状态栏获取运营商和wifi,我想知道是否有其他方式或更好的方式? 另外我怎么能得到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]; 

如果我使用的任何方法都是私有的,则无关紧要。

使用CoreTelephony和CTTelephonyCenter观察者:

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

改编自Cvindicators上的iPhone Dev Wiki文章 。

这些方法不再适用于任何大于8.4的iOS SDK(?)我相信。 要访问它们,请使用extern函数和常量创建一个新标头:

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

我也使用私有API ..但我从(可见)状态栏中获得此信号强度。

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

希望这可以帮助!!