我在越狱的 iOS 5 iPhone 上监控了标准的 Darwin 通知和 Core Telphony 通知。
我没有看到任何真正符合您要求的通知。
有一些核心电话通知会出现,但不是在每次传输开始和结束时都会发出。看起来当数据服务连接时,可能会有一些通知,但同样,它们确实不是您所要求的:
kCTIndicatorRadioTransmitNotification
kCTRegistrationDataStatusChangedNotification
如果您想尝试自己监控所有Core Telephony 通知,您可以使用 Core Telephony 框架和 CT 通知中心:
-(void) registerCallback {
id ct = CTTelephonyCenterGetDefault();
CTTelephonyCenterAddObserver(ct, // center
NULL, // observer
telephonyEventCallback, // callback
NULL, // event name (or all)
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
}
static void telephonyEventCallback(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo)
{
//NSLog(@"telephonyEventCallback()");
NSString* notifyName = (__bridge NSString*)name;
if ([notifyName isEqualToString:@"kCTMessageReceivedNotification"]) { // received SMS
} /* look for other notification names here */
}
在上面的调用中,我传递NULL
给CTTelephonyCenterAddObserver()
调用,它注册了所有通知。如果您知道要查找的内容,当然可以传递一个特定通知的名称,例如您发布的示例com.apple.iokit.hid.displayStatus
。
关于john.k.doe 的 option,您可以尝试在该属性上使用 Key Value Observing,以便在它更改时得到通知:
UIApplication* app = [UIApplication sharedApplication];
[app addObserver: self forKeyPath: @"networkActivityIndicatorVisible" options: NSKeyValueObservingOptionNew context: nil];
您的观察者回调在哪里:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"networkActivityIndicatorVisible"]) {
// process here
NSLog(@"network activity indicator change!");
BOOL active = [UIApplication sharedApplication].networkActivityIndicatorVisible;
}
}
我不确定 KVO 是否仍然可以在后台工作,这可能取决于您的应用程序如何管理后台。
但是,当然,这要求应用程序在访问网络时实际使用该属性,并非所有应用程序都这样做。不幸的是,Apple 甚至将该指标设置为第三方开发人员需要控制的东西。在 Android 和 BlackBerry 上,操作系统足够智能,可以知道何时发送/接收。
所以,这仍然只是你需要的部分:(