Cocoa 当用户代理进程终止时,如何运行代码?
我想要什么 我希望Info.plist中的helper应用程序用户代理LSUIElement为True,以便在终止时将其自身添加到登录项中 问题 在helper应用程序进程终止之前,我无法运行任何代码。 我的添加到登录项代码运行良好 背景 我有一个一直运行的helper应用程序用户代理进程 在第一次启动时,它将自己添加到登录项中 如果在下次登录时移动了应用程序,则无法找到helper应用程序进程,因此不会启动 我试过的 我想知道是否应该将NSApplication子类化并覆盖terminate:或stop:并将代码放在其中,但这似乎有些过分。肯定有更好的办法吗 我在NSApp代表中尝试了所有这些不同的东西:Cocoa 当用户代理进程终止时,如何运行代码?,cocoa,user-agent,nsapplication,Cocoa,User Agent,Nsapplication,我想要什么 我希望Info.plist中的helper应用程序用户代理LSUIElement为True,以便在终止时将其自身添加到登录项中 问题 在helper应用程序进程终止之前,我无法运行任何代码。 我的添加到登录项代码运行良好 背景 我有一个一直运行的helper应用程序用户代理进程 在第一次启动时,它将自己添加到登录项中 如果在下次登录时移动了应用程序,则无法找到helper应用程序进程,因此不会启动 我试过的 我想知道是否应该将NSApplication子类化并覆盖terminate:
-(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日
经过进一步的挖掘,问题更多的是进程从未真正退出,更常见的是它们被操作系统杀死
这意味着当您选择退出活动监视器中的进程或关闭计算机时,不会调用terminate委托方法
运行以下Applescript时,不会调用委托方法:
tell application "System Events"
tell application "LapsusHelperApp"
quit
end tell
end tell
经过进一步的挖掘,问题更多的是进程从未真正退出,更常见的是它们被操作系统杀死
这是因为您为应用程序启用了突然终止。它是opt-in,所以只需从Info.plist中删除该键值对,您就可以开始获取applicationWillTerminate:messages
另外,至少在3.x中,Xcode中的Terminate按钮的工作方式始终与突然终止相同,因此当从Xcode终止应用程序时,您永远不会收到applicationWillTerminate:消息
顺便说一下:
applicationWillTerminate:是通知消息,因此其参数是NSNotification对象,而不是NSApplication对象。
没有ApplicationIDTerminate:。稍作思考就会发现原因。☺
经过进一步的挖掘,问题更多的是进程从未真正退出,更常见的是它们被操作系统杀死
这是因为您为应用程序启用了突然终止。它是opt-in,所以只需从Info.plist中删除该键值对,您就可以开始获取applicationWillTerminate:messages
另外,至少在3.x中,Xcode中的Terminate按钮的工作方式始终与突然终止相同,因此当从Xcode终止应用程序时,您永远不会收到applicationWillTerminate:消息
顺便说一下:
applicationWillTerminate:是通知消息,因此其参数是NSNotification对象,而不是NSApplication对象。
没有ApplicationIDTerminate:。稍作思考就会发现原因。☺
谢谢,Peter,但是在为我的助手应用程序Info.plist、清理和重建添加了一个值为NO的NSSupportsSuddenTermination布尔键之后,它似乎仍然没有得到应用程序willTerminate:通知。我甚至试着在启动时调用[[NSProcessInfo processInfo]disableSuddenTermination],但仍然没有任何乐趣。你知道为什么会这样吗?顺便说一句,你的建议对于一个Cocoa应用程序很有用,因为在info.plist中LSUIElement键不存在或不存在。但是我的助手应用程序进程应该是一个用户代理,所以我使用的LSUIElement为YES,在这个设置下,我甚至无法让一个简单的Xcode项目运行applicationWillTerminate:不需要显式禁用突然终止;正如我所说,它是opt-in,这意味着默认情况下它是禁用的。您必须显式地启用它。如果您使用Xcode的Terminate命令,无论应用程序是否突然终止,它都会终止您的应用程序。只有在选择“强制退出”时,“活动监视器”才会执行此操作。除了注销外,您通常如何退出应用程序?来自另一个进程的Apple事件,例如系统首选项?正在发送NSApp终止:?还有别的办法吗?别忘了注销。如果您需要在退出时执行此操作,无论我对您的问题有何评论,请使用signal或sigaction函数捕获SIGTERM,这些函数记录在手册页中。请注意,这意味着您的应用程序将不会立即退出,如果从Xcode终止应用程序时addHelperAppToLoginItems被破坏,则可能会崩溃。感谢所有这些详细信息。我将坚持将代码放入applicationWillTerminate:和NSWorkspaceWillPowerOff通知中。顺便说一句,从Cocoa文档中可以看到:当用户请求注销或机器关机时发布。它现在在注销时运行良好。再次感谢!谢谢你,Peter,但是在为我的助手应用程序Info.plist、cleaning和r添加了一个值为NO的NSSupportsSDInternition布尔键之后
在ebuild中,它似乎仍然没有得到applicationWillTerminate:notifications。我甚至试着在启动时调用[[NSProcessInfo processInfo]disableSuddenTermination],但仍然没有任何乐趣。你知道为什么会这样吗?顺便说一句,你的建议对于一个Cocoa应用程序很有用,因为在info.plist中LSUIElement键不存在或不存在。但是我的助手应用程序进程应该是一个用户代理,所以我使用的LSUIElement为YES,在这个设置下,我甚至无法让一个简单的Xcode项目运行applicationWillTerminate:不需要显式禁用突然终止;正如我所说,它是opt-in,这意味着默认情况下它是禁用的。您必须显式地启用它。如果您使用Xcode的Terminate命令,无论应用程序是否突然终止,它都会终止您的应用程序。只有在选择“强制退出”时,“活动监视器”才会执行此操作。除了注销外,您通常如何退出应用程序?来自另一个进程的Apple事件,例如系统首选项?正在发送NSApp终止:?还有别的办法吗?别忘了注销。如果您需要在退出时执行此操作,无论我对您的问题有何评论,请使用signal或sigaction函数捕获SIGTERM,这些函数记录在手册页中。请注意,这意味着您的应用程序将不会立即退出,如果从Xcode终止应用程序时addHelperAppToLoginItems被破坏,则可能会崩溃。感谢所有这些详细信息。我将坚持将代码放入applicationWillTerminate:和NSWorkspaceWillPowerOff通知中。顺便说一句,从Cocoa文档中可以看到:当用户请求注销或机器关机时发布。它现在在注销时运行良好。再次感谢!如果要在启动时将应用程序添加到登录项,为什么要在applicationWillTerminate:?如果要在启动时将应用程序添加到登录项,为什么要在applicationWillTerminate:?