iOS事件/通知networking活动向上/向下/closures
当networking活动从无到有(而另一种方式)时,我想为我的iOS应用程序提供事件/callback。 类似于Android如何使用onDataActivity()。 我不是在谈论可达性,而是在数据实际开始或停止传输。
该应用程序不适用于App Store,也不适用于越狱。 我有一个类似的function,检测屏幕开/关使用时的工作
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.iokit.hid.displayStatus"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately);
以及其他事件如
com.apple.springboard.hasBlankedScreen com.apple.springboard.lockstate
现在我想知道是否有数据开始或停止传输的事件? 或者,如果有人能指出一个完整的所有可以用上面的方法监控的事件清单的方向。
我在越狱的iOS 5 iPhone上监控了标准Darwin通知和核心电话通知。
我没有看到任何通知 ,真正做你想要的。
有几个核心电话通知出来,但不是在每个传输开始和结束。 它看起来像数据服务连接时,可能会有一些通知,但是,他们真的不是你所要求的:
kCTIndicatorRadioTransmitNotification kCTRegistrationDataStatusChangedNotification
如果您想尝试监视所有核心电话通知,则可以使用核心电话框架和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的选项 ,您可以尝试在该属性上使用Key Value Observing,以便在更改时收到通知:
UIApplication* app = [UIApplication sharedApplication]; [app addObserver: self forKeyPath: @"networkActivityIndicatorVisible" options: NSKeyValueObservingOptionNew context: nil];
你的观察者callback是:
- (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是否仍然可以在后台工作,这可能取决于您的应用如何pipe理后台。
但是,当然,这要求应用程序在访问networking时实际使用该属性,而不是所有这些属性。 不幸的是,苹果甚至把这个指标作为第三方开发者需要控制的东西。 在Android和黑莓手机上,操作系统足够聪明,知道什么时候发送/接收。
所以,这仍然只是你需要的一部分:(
这真的没有系统通知。
如果你正在讨论监视你自己应用程序的活动,那么你显然可以控制这个活动,并且应该能够把你知道访问networking的任何呼叫括起来。
如果您正在讨论监视所有其他应用程序的活动,并且您愿意假定他们严格遵守Apple准则并打开/closures状态栏中的networking活动状态指示器,则可以调用:
[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible];
但是这显然要求你以轮询方式这样做,最好在后台线程/ GCD队列中完成。 那么你可以发布你自己的通知,在你的应用程序的其他地方看到。