Частный 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
. Уведомления, как представляется, доставляются через CPDistributedNotificationCenter
deliverNotification:userInfo:
, который действует как прокладка для NSNotificationCenter
's postNotificationName:object:userInfo:
.
Что мне здесь не хватает?
Как насчет XPC, где каждый процесс может поддерживать двунаправленное соединение с демоном? Или XPC, плюс notify_post? Единственным недостатком является то, что XPC - iOS5 +. Я бы сказал, что XPC является новым стандартом для библиотек с демонами, выступающими в роли backend. – conradev
Я не хочу, чтобы у демона были какие-либо знания о клиентах. XPC поражает, что я просто хочу запускать одноразовые уведомления, и если есть какие-то заинтересованные клиенты, они могут действовать на них. – yfrancis
Активатор использует механизм регистрации, 'CPDistributedMessagingCenter' требует имя удаленного центра для отправки сообщений и, следовательно, требует знания клиента – yfrancis