iOS上的私有AppSupport
框架有一个名为CPDistributedNotificationCenter
的类,它似乎支持OS X上NSDistributedNotificationCenter
提供的功能的一部分。
我正在尝试使用此类从后台守护程序发布通知,以便其他进程中的多个客户端可以接收这些通知并对其进行操作。我意识到还有其他选项,包括CPDistributedMessagingCenter
或CFMessagePort
,低级马赫端口甚至是达尔文的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
参数,我可以看到每个通知都发送到客户的通知中心,但“你好”不是其中之一。
通过查看SpringBoard
和CPDistributedNotificationCenter
的反汇编,我获得了代码的灵感。通知似乎是通过CPDistributedNotificationCenter
的{{1}}传递的,deliverNotification:userInfo:
充当NSNotificationCenter
postNotificationName:object:userInfo:
的垫片。
我在这里缺少什么?
答案 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!"];
{
上记录了这个API