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

Sun*_*kas 3 notifications objective-c iphone-privateapi ios springboard

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

该应用程序不适用于App Store,也不适用于越狱.我有一个类似的功能,通过使用检测屏幕何时开启/关闭工作

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
      NULL, // observer
      displayStatusChanged, // callback
      CFSTR("com.apple.iokit.hid.displayStatus"), // event name
      NULL, // object
      CFNotificationSuspensionBehaviorDeliverImmediately);
Run Code Online (Sandbox Code Playgroud)

以及其他事件

com.apple.springboard.hasBlankedScreen
com.apple.springboard.lockstate
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ate 5

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

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

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

kCTIndicatorRadioTransmitNotification
kCTRegistrationDataStatusChangedNotification
Run Code Online (Sandbox Code Playgroud)

如果您想尝试自己监控所有 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 */
}
Run Code Online (Sandbox Code Playgroud)

在上面的调用中,我传递NULLCTTelephonyCenterAddObserver()调用,该调用注册所有通知.如果您知道要查找的内容,您当然可以传递一个特定通知的名称,例如您发布的示例com.apple.iokit.hid.displayStatus.

关于john.k.doe的选项,您可以尝试在该属性上使用Key Value Observing,以便在更改时收到通知:

UIApplication* app = [UIApplication sharedApplication];
[app addObserver: self forKeyPath: @"networkActivityIndicatorVisible" options: NSKeyValueObservingOptionNew context: nil];
Run Code Online (Sandbox Code Playgroud)

你的观察者回调是:

- (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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定KVO是否仍然可以在后台运行,这可能取决于您的应用程序如何管理后台运行.

但是,当然,这需要应用程序在访问网络时实际使用该属性,而这并非所有属性都可以.令人遗憾的是,Apple甚至将该指标设为第三方开发者需要控制的指标.在Android和BlackBerry上,操作系统非常智能,可以知道它何时发送/接收.

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