Key Value Observing 是一个很棒的功能,但它不能(直接)帮助您解决这个特定问题。对于那些不熟悉他所指的类的人来说,它是 iOS SpringBoard 本身的一个私有类。因此,他无法控制它如何发布他感兴趣的数据。
你不能只观察任何旧数据。它必须被编码为符合键值观察 (KVO) 标准。如果您查看SBStatusBarDataManager.h(这是 iOS 4 版本...生成您需要的版本class-dump
)...您会发现它不是这样编码的 :(
但是,无论如何,您都可以使用一些动态的 Objective-C 运行时特性来获取数据。请参阅此处直接获取私有/受保护的实例变量。
然后,只需在本地声明一个结构以匹配跳板标头中的内容,然后执行以下操作:
// this was coded to match the iOS 5.0 header, but of course, this may
// change with each iOS version
typedef struct {
char itemIsEnabled[23];
char timeString[64];
int gsmSignalStrengthRaw;
int gsmSignalStrengthBars;
char serviceString[100];
char serviceCrossfadeString[100];
char serviceImages[3][100];
char operatorDirectory[1024];
unsigned int serviceContentType;
int wifiSignalStrengthRaw;
int wifiSignalStrengthBars;
unsigned int dataNetworkType;
int batteryCapacity;
unsigned int batteryState;
char notChargingString[150];
int bluetoothBatteryCapacity;
int thermalColor;
unsigned int thermalSunlightMode:1;
unsigned int slowActivity:1;
unsigned int syncActivity:1;
char activityDisplayId[256];
unsigned int bluetoothConnected:1;
unsigned int displayRawGSMSignal:1;
unsigned int displayRawWifiSignal:1;
} SbStatusBarDataType;
按名称检索 ivars 的助手:
#import <objc/runtime.h>
- (void *) instanceVariableForObject: (id)obj andKey: (NSString *)key {
if (key != nil) {
Ivar ivar = object_getInstanceVariable(obj, [key UTF8String], NULL);
if (ivar) {
return (void *)((char *)obj + ivar_getOffset(ivar));
}
}
return NULL;
}
最后,像这样获取数据:
// get an instance to the data manager this way, or however you're
// doing it via Mobile Substrate
SBStatusBarDataManager* mgr = [SBStatusBarDataManager sharedDataManager];
SbStatusBarDataType data = *(SbStatusBarDataType*)[self instanceVariableForObject: mgr andKey: @"_data"];
int signalStrength = data.wifiSignalStrengthRaw;
然后,您可以在您认为足够快的某个时间间隔内重复查询此数据。
否则,请尝试查看 SBStatusBarDataManager.h 中的方法。看起来它们中的一些可能会在信号强度变化的精确时间被调用。如果您挂钩这些方法,您可能能够推送数据已更改的通知,这样您就不必不断地轮询数据。
例如:
- (void)_dataChanged;
- (void)_updateSignalStrengthItem;
- (void)_signalStrengthChange;
如果您想确定 WiFi 信号强度何时发生变化,那么所有这些看起来都适合挂接。但是,我对这些没有经验,这将是您的反复试验。祝你好运!
与您的次要问题有关的一些参考资料:
类转储
关于 Obj-C 运行时 API 的 Apple 文档