【问题标题】:Killing Launch Daemon杀死启动守护进程
【发布时间】:2013-03-15 11:23:02
【问题描述】:

我的应用程序运行一个启动守护程序,因此主应用程序可以与 iTunes 同步启动。 守护程序运行没有问题。

但是,当我禁用守护程序在登录时启动时,守护程序已经启动并一直打开主应用程序,直到用户重新启动计算机并且守护程序关闭。

如何终止我的守护进程?因为是没有界面的进程,所以app没有NSRunningApplication


编辑

值得一提的是,应用程序必须被沙盒化。

【问题讨论】:

  • 强制退出窗口是否可见?
  • @AnoopVaidya 不,它只是背景
  • 我建议你提供一些东西来选择它,比如停靠图标或 Apple 菜单图标。
  • @AnoopVaidya 嗯。守护进程的想法实际上只是在启动 iTunes 时启动主应用程序。除非 iTunes 启动,否则用户不应看到另一个进程已启动。还是您有其他想法?
  • 我创建了一个类似于 Force-Quit 的应用程序,但它能够显示所有进程,如相机、蓝牙、wifi 等。我使用苹果菜单来启动和停止。这就是我要求你做的。你会在扬声器、弹出、wifi、蓝牙旁边看到一个小图标....

标签: objective-c macos cocoa


【解决方案1】:

好的,通过从守护程序服务列表中删除帮助应用程序,该应用程序会自动被终止。


代码

- (void)setLaunchHelperAtLogin:(BOOL)launchHelperAtLogin {
    if (launchHelperAtLogin != self.launchHelperAtLogin) {
        // Creating helper app complete URL
        NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
        NSURL *url = [bundleURL URLByAppendingPathComponent:kHelperPath];

        // Registering helper app
        OSStatus status = LSRegisterURL((__bridge CFURLRef)url, true);
        if (status != noErr) {
            NSError *error = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
            NSLog(@"%@", error);
        }

        // Setting login
        if (!SMLoginItemSetEnabled((CFStringRef)kHelperBundleIdentifier, launchHelperAtLogin)) {
            NSLog(@"SMLoginItemSetEnabled failed!");
        }
    }
}

【讨论】: