NSNotifications между приложениями в OS X - PullRequest
0 голосов
/ 27 января 2011

У меня есть работающее приложение, которое отправляет NSNotification для себя, когда пользователь нажимает кнопку в окне (XCode, используя PyObjC):

from Foundation import *
from AppKit import *
import objc

class SpeakAppDelegate(NSObject):
    def applicationDidFinishLaunching_(self, sender):
        NSLog("Application really did finish launching.")
        nc = NSNotificationCenter.defaultCenter()
        nc.addObserver_selector_name_object_(
            self, "mycallback:", 'love_note', None)
            #self, "mycallback:", None, None)

    @objc.signature('v@0:@8')
    def mycallback_(self,note):
        print 'note'
        print note.description()

    @objc.IBAction
    def button_(self,sender):
        print sender, 'button'
        nc = NSNotificationCenter.defaultCenter()
        nc.postNotificationName_object_userInfo_(
            'love_note', None, {'path':'xyz'})

(Подробно: подпись, вероятно, не совсем правильная,но это работает).

Оставьте его работающим.Теперь я хочу выяснить, как отправить такое же уведомление в это приложение из другого приложения, например:

// gcc tell.m -o test -framework Foundation
#import <Foundation/Foundation.h>

int main() {
    NSNotificationCenter *nc;
    nc = [NSNotificationCenter defaultCenter];
    [nc postNotificationName:@"love_note"
                      object:nil
                    userInfo:nil ];
    return 0;
}

. Я заметил, что если я откомментирую строку в первом приложении, то получу многодругие уведомления, но все они из событий, связанных с моим приложением.Я никогда ничего не слышу снаружи.Как я могу отправить уведомление между процессами?И потом, есть ли способ отправить уведомление из командной строки?Спасибо.

Обновление: просто замените NSDistributedNotificationCenter выше, и пример работает.

1 Ответ

2 голосов
/ 27 января 2011

Я не верю, что есть способ установить связь между двумя приложениями с помощью NSNotificationCenter. Я не использовал его раньше, но я считаю, что взаимодействие двух приложений - это скорее работа для Распределенных объектов .

Из документации Apple:

Каждый процесс имеет значение по умолчанию Центр уведомлений, к которому вы обращаетесь с NSNotificationCenter + метод класса defaultCenter. Этот центр уведомлений обрабатывает уведомления в рамках одного процесса. Для связи между процессами на ту же машину, используйте распределенную Центр уведомлений (см. «NSDistributedNotificationCenter»).

EDIT

Кажется, что NSDistributedNotificationCenter может также делать то, что вы ищете, не углубляясь в распределенные объекты.

...