启动守护程序侦听NSWorkspaceDidLaunchApplicationNotification

时间:2013-12-05 13:46:48

标签: objective-c macos launchd nsapplication nsworkspace

我有一个启动守护程序,我希望每次启动应用程序时都运行一个函数。

我目前正在使用NSWorkspace来检查应用程序的启动。

/ Library / LaunchDaemons / 中的

parasited.plist
<?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等”应用程序时运行一个功能。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您的应用程序没有中心run loop,可以在其中循环并等待通知。

作为实验,在NSWorkspace调用后添加CFRunLoopRun()调用。 CFRunLoopRun将循环,直到进程终止。

请参阅Matt Gallagher的demystifying NSApplication by recreating it帖子,详细了解运行循环及其在保持应用程序运行和处理事件方面所起的作用。