用于网络活动的iOS事件/通知上/下/下

时间:2013-01-22 09:35:37

标签: ios objective-c notifications iphone-privateapi springboard

当网络活动从无到有(以及相反的方式)时,我想要为我的iOS应用程序进行事件/回调。类似于Android对onDataActivity()的处理方式。我不是在谈论可达性,而是在数据实际开始或停止传输时。

该应用不适用于App Store,也不适用于越狱。我有类似的功能,通过使用

检测屏幕何时开启/关闭工作
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

现在我想知道是否存在数据启动或停止传输的事件?或者,如果有人可以指出我可以通过上述方式监控的所有事件的完整列表的方向。

2 个答案:

答案 0 :(得分:5)

我在越狱的iOS 5 iPhone上监控了标准的Darwin通知和Core Telphony通知。

我没有看到任何通知真正做到你想要的。

有一些核心电话通知出现,但不是每次传输的开始和结束。看起来当数据服务连接时,可能会有一些通知,但同样,它们确实不是您要求的:

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's option,您可以尝试在该属性上使用键值观察,以便在更改时收到通知:

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上,操作系统非常智能,可以知道它何时发送/接收。

所以,这仍然只是你需要的部分原因:(

答案 1 :(得分:3)

确实没有系统通知。

如果您正在谈论监控自己应用程序的活动,您显然可以控制它,并且应该能够将您知道的任何电话括起来访问网络...

如果您正在讨论监控所有其他应用程序的活动,并且您愿意假定它们严格遵守Apple指南并打开/关闭状态栏中的网络活动状态指示器,则可以调用:

[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible];

但这显然要求您以轮询方式执行此操作,最好在后台线程/ GCD队列中完成。然后你可以发布你自己的通知,以便在你的应用程序的其他地方看到。