gpt4 book ai didi

cocoa - 当用户代理进程终止时如何运行代码?

转载 作者:行者123 更新时间:2023-12-03 16:55:42 24 4
gpt4 key购买 nike

我想要什么

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

问题

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

背景

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

我尝试过的

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

我在 NSApp 委托(delegate)中尝试了所有这些不同的事情:

-(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 委托(delegate)方法不能与用户代理进程一起使用?

如何让进程在终止时检查登录项?

如果有任何帮助,我将非常感激。谢谢!

更新 1 6/2/11

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

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

当运行以下 Applescript 时,委托(delegate)方法会被调用:

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

最佳答案

After some further digging, the problem is more that processes never really get quit, it's more common for them to get killed by the OS.

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

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

顺便说一下:

  • applicationWillTerminate: 是一个通知消息,因此它的参数是一个 NSNotification 对象,而不是 NSApplication 对象。
  • 没有applicationDidTerminate:。稍加思考就会明白原因。 ☺

关于cocoa - 当用户代理进程终止时如何运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4914284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com