Запустите демон Listen для NSWorkspaceDidLaunchApplicationNotification

У меня есть демон запуска, и я хотел бы, чтобы он запускал функцию каждый раз при запуске приложения.

В настоящее время я использую NSWorkspace для проверки запуска приложений.

parasited.plist в /Library/LaunchDaemons/

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>parasited</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/parasited</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>OnDemand</key>
    <false/>
</dict>
</plist>

паразит main.m

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        [[[NSWorkspace sharedWorkspace]notificationCenter]addObserver:[[Parasited alloc] init] selector:@selector(inject) name:NSWorkspaceDidLaunchApplicationNotification object:nil];

        }
}

Похоже, мой процесс parasited продолжает перезапускаться, и я не могу понять, почему. Моя цель — запускать функцию каждый раз, когда запускается приложение, такое как «Safari, Mail, Finder и т. д.».

Ваша помощь приветствуется!


person atomikpanda    schedule 05.12.2013    source источник
comment
Нет ничего, что говорило бы main, что ему нужно зависнуть. Вам нужен цикл выполнения.   -  person Petesh    schedule 05.12.2013


Ответы (1)


В вашем приложении нет центрального цикла выполнения. в котором зацикливаться и ждать уведомлений.

В качестве эксперимента добавьте вызов CFRunLoopRun() после вызова NSWorkspace. CFRunLoopRun будет выполняться до тех пор, пока процесс не будет завершен.

Подробнее о цикл выполнения и роль, которую он играет в поддержании работы вашего приложения и обработке событий.

person Graham Miln    schedule 05.12.2013