4

当网络活动从无到启动(反之亦然)时,我想要我的 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

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

4

2 回答 2

5

我在越狱的 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 */
}

在上面的调用中,我传递NULLCTTelephonyCenterAddObserver()调用,它注册了所有通知。如果您知道要查找的内容,当然可以传递一个特定通知的名称,例如您发布的示例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 上,操作系统足够智能,可以知道何时发送/接收。

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

于 2013-01-27T11:23:30.067 回答
3

确实没有针对此的系统通知。

如果您正在谈论监视进出您自己的应用程序的活动,那么您显然可以控制它,并且应该能够将您知道的任何访问网络的呼叫括起来……</p>

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

[[UIApplication sharedApplication] isNetworkActivityIndicatorVisible];

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

于 2013-01-27T07:08:22.047 回答