1

我想要的是

我想要一个帮助应用程序用户代理(Info.plist 中的 LSUIElement 为 True)在终止时将自身添加到登录项中。

问题

在帮助应用程序进程终止之前,我无法运行任何代码。我的“添加到登录项”代码运行良好。

背景

  • 我有一个一直在运行的帮助应用程序用户代理进程
  • 首次启动时,它会将自身添加到登录项中
  • 如果应用程序被移动,则在下次登录时,找不到帮助应用程序进程,因此不会启动

我试过的

我想知道我是否应该继承 NSApplication 并覆盖 terminate: 或 stop: 并将我的代码放在那里,但这似乎有点矫枉过正。肯定有更好的方法吗?

我在 NSApp 委托中尝试了所有这些不同的东西:

-(void)applicationWillTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(void)applicationDidTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
     [self addHelperAppToLoginItems]
}

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
                                                            selector:@selector(addHelperAppToLoginItems) 
                                                                name:NSWorkspaceDidTerminateApplicationNotification
                                                              object:nil];  

}

-(void)addHelperAppToLoginItems {
      // This code never gets called!
}

为什么 NSApplication 委托方法不适用于用户代理进程?

以及如何获得在终止时检查登录项的过程?

我将非常感谢任何帮助。谢谢!

2011 年 6 月 2 日更新 1

经过进一步挖掘,问题更多的是进程永远不会真正退出,它们被操作系统杀死更为常见。

这意味着当您选择“退出”活动监视器中的进程或关闭计算机时,不会调用终止委托方法。

运行以下 Applescript 时,会调用委托方法:

tell application "System Events"
    tell application "LapsusHelperApp"
         quit
    end tell
end tell
4

1 回答 1

4

经过进一步挖掘,问题更多的是进程永远不会真正退出,它们被操作系统杀死更为常见。

这是因为您为您的应用程序启用了突然终止。它是可选的,因此只需从 Info.plist 中删除该键值对,然后您将开始applicationWillTerminate:接收消息。

Also, the Terminate button in Xcode (at least in 3.x) always works the same way sudden termination does, so you will never get a applicationWillTerminate: message when terminating your app from Xcode.

By the way:

  • applicationWillTerminate: is a notification message, so its argument is an NSNotification object, not an NSApplication object.
  • There is no applicationDidTerminate:. A moment's reflection will reveal why. ☺</li>
于 2011-02-06T19:55:37.917 回答