2012-11-03 41 views
4
发布通知

iOS上的私人AppSupport框架有一个名为CPDistributedNotificationCenter类,它似乎支持由NSDistributedNotificationCenter在OS X提供的功能的子集如何接收通过CPDistributedNotificationCenter

我试图使用此类发布来自后台守护进程的通知,以便其他进程中的多个客户端可以接收这些通知并对其执行操作。我意识到还有其他选项,包括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'通知。如果我用nil替换addObserver调用中的name参数,我可以看到每个通知都发送到客户的通知中心,但'hello'不是其中的一个。

我通过查看SpringBoardCPDistributedNotificationCenter的反汇编获得了我的代码的灵感。通知似乎通过CPDistributedNotificationCenterdeliverNotification:userInfo:递送,其作为NSNotificationCenter的垫片postNotificationName:object:userInfo:的垫片。

我在这里错过了什么?

+0

XPC,其中每个进程可以保持与守护进程的双​​向连接?还是XPC,加上notify_post?一个缺点是XPC是iOS5 +。我认为XPC是图书馆的新标准,守护进程充当后端。 – conradev

+0

我不希望守护进程有任何客户知识。 XPC击败了我,我只想发射一次性通知,如果有任何感兴趣的客户,他们可以采取行动。 – yfrancis

+0

Activator使用注册机制,CPDistributedMessagingCenter需要远程​​中心名称来发送消息,因此需要客户端的知识 – yfrancis

回答

5

想通了。在发送通知之前,守护进程必须等待通知表明客户端已开始监听。没有待办事项,即使守护程序服务器在客户端之前运行,也会有注册延迟。你不能简单地启动你的服务器,并立即发布通知给听众。对我来说,以下工作:

在服务器初始化:

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!"]; 
{ 

我已经证明这个API的iPhoneDevWiki