如何在用户代理进程终止时运行代码?

时间:2011-02-06 15:45:12

标签: cocoa user-agent nsapplication

我想要什么

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

问题

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

背景

  • 我有一个随时运行的帮助应用用户代理进程
  • 首次启动时,它会将自己添加到登录项
  • 如果移动了应用,则在下次登录时,无法找到帮助应用进程,因此无法启动

我尝试过什么

我想知道我是否应该继承NSApplication并覆盖terminate:或停止:并将我的代码放在那里,但这似乎有点过分。当然有更好的方法吗?

我在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

1 个答案:

答案 0 :(得分:4)

  

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

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

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

顺便说一下:

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