4

AppSupportiOSのプライベートフレームワークにはCPDistributedNotificationCenter、OSXで提供される機能のサブセットをサポートしているように見えるというクラスがあります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引数をに置き換えると、クライアントの通知センターに配信されるすべての通知を確認できますが、「hello」はその1つではありません。addObservernil

SpringBoardとの逆アセンブルを見て、コードのインスピレーションを得ましたCPDistributedNotificationCenter。通知は、のシムとして機能するCPDistributedNotificationCenterのを介して配信されるように見えます。deliverNotification:userInfo:NSNotificationCenterpostNotificationName:object:userInfo:

ここで何が欠けていますか?

4

1 に答える 1

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に文書化しました

于 2012-11-03T23:30:12.613 に答える