我想要的是

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

问题

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

背景


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


我尝试过的

我想知道我是否应该子类化NSApplication并重写终止:或停止:并将我的代码放在那儿,但这似乎太过分了。当然有更好的方法吗?

我在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委托方法不适用于用户代理进程?

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

如有任何帮助,我将不胜感激。谢谢!

更新1 6/2/11

经过进一步的挖掘,问题出在更多的是进程从未真正退出过,它们更容易被操作系统杀死。

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

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

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

最佳答案

经过进一步的挖掘,问题出在更多的是进程从未真正退出过,它们更容易被操作系统杀死。


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

此外,Xcode中的Terminate按钮(至少在3.x中)始终与突然终止相同,因此从Xcode终止应用程序时,您永远不会收到applicationWillTerminate:消息。

顺便说说:


applicationWillTerminate:是一条通知消息,因此其参数是NSNotification对象,而不是NSApplication对象。
没有applicationDidTerminate:。片刻的反思将揭示原因。 ☺

10-08 03:13