2012-11-03 2 views
4

Частный AppSupport баз по прошивке имеет класс с именем CPDistributedNotificationCenter который, кажется, поддерживает подмножество функций, предоставляемые NSDistributedNotificationCenter на OS X.Как получать уведомления отправленных через CPDistributedNotificationCenter

Я пытаюсь использовать этот класс отправлять уведомления от фонового демона, чтобы несколько клиентов в других процессах могли получать эти уведомления и действовать на них. Я понимаю, что есть другие варианты, в том числе CPDistributedMessagingCenter или CFMessagePort, порты малой мощности или даже darwin's 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:

К сожалению, клиент никогда не получает уведомление «привет». Если я заменил аргумент name в вызове addObserver с nil, я могу видеть каждое уведомление, отправленное в центр уведомлений клиента, но «привет» не является одним из них.

Я получил вдохновение для своего кода, посмотрев на разборку SpringBoard и CPDistributedNotificationCenter. Уведомления, как представляется, доставляются через CPDistributedNotificationCenterdeliverNotification:userInfo:, который действует как прокладка для NSNotificationCenter's postNotificationName:object:userInfo:.

Что мне здесь не хватает?

+0

Как насчет XPC, где каждый процесс может поддерживать двунаправленное соединение с демоном? Или XPC, плюс notify_post? Единственным недостатком является то, что XPC - iOS5 +. Я бы сказал, что XPC является новым стандартом для библиотек с демонами, выступающими в роли backend. – conradev

+0

Я не хочу, чтобы у демона были какие-либо знания о клиентах. XPC поражает, что я просто хочу запускать одноразовые уведомления, и если есть какие-то заинтересованные клиенты, они могут действовать на них. – yfrancis

+0

Активатор использует механизм регистрации, '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

Смежные вопросы