如何接收通过CP DistributedNotificationCenter发布的通知

时间:2012-11-03 18:02:26

标签: objective-c ios cocoa ipc

iOS上的私有AppSupport框架有一个名为CPDistributedNotificationCenter的类,它似乎支持OS X上NSDistributedNotificationCenter提供的功能的一部分。

我正在尝试使用此类从后台守护程序发布通知,以便其他进程中的多个客户端可以接收这些通知并对其进行操作。我意识到还有其他选项,包括CPDistributedMessagingCenterCFMessagePort,低级马赫端口甚至是达尔文的notify_post。如果守护程序不了解客户端,我更喜欢它,并且我希望能够将数据与通知一起传递,notify_post不允许这样做。

目前,这就是我在守护进程中所做的事情:

CPDistributedNotificationCenter* center;
center = [CPDistributedNotificationCenter centerNamed:@"com.yfrancis.notiftest"];
[center runServer];
[center postNotificationName:@"hello"];

在客户端:

CPDistributedNotificationCenter* center;
center = [CPDistributedNotificationCenter centerNamed:@"com.yfrancis.notiftest"];
[center startDeliveringNotificationsToMainThread];

NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc addObserver:[Listener new] 
       selector:@selector(gotNotification:)
           name:@"hello"
         object:nil];

其中Listener是一个实现单个方法gotNotification:

的简单类

不幸的是,客户端从未收到“hello”通知。如果我用name替换addObserver来电中的nil参数,我可以看到每个通知都发送到客户的通知中心,但“你好”不是其中之一。

通过查看SpringBoardCPDistributedNotificationCenter的反汇编,我获得了代码的灵感。通知似乎是通过CPDistributedNotificationCenter的{​​{1}}传递的,deliverNotification:userInfo:充当NSNotificationCenter postNotificationName:object:userInfo:的垫片。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

想出来。在发送通知之前,您的守护程序必须等待指示客户端已开始侦听的通知。没有积压,即使守护程序服务器在客户端之前运行,也存在注册延迟。您不能简单地启动服务器并立即向听众发布通知。以下适用于我:

在服务器init中:

self.center = [CPDistributedNotificationCenter centerNamed:@"com.yfrancis.notiftest"];
[self.center runServer];

// requires a runloop
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
       selector:@selector(clientEvent:)
           name:@"CPDistributedNotificationCenterClientDidStartListeningNotification"
         object:self.center];

并确保在服务器中实现以下方法:

- (void)clientEvent:(NSNotification*)notification
{
    // you can now send notifications to the client that caused this event
    // and any other clients that were registered previously
    [self.center postNotificationName:@"hello!"];
{

我在iPhoneDevWiki

上记录了这个API