Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 当用户代理进程终止时,如何运行代码?_Cocoa_User Agent_Nsapplication - Fatal编程技术网

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

Cocoa 当用户代理进程终止时,如何运行代码?,cocoa,user-agent,nsapplication,Cocoa,User Agent,Nsapplication,我想要什么 我希望Info.plist中的helper应用程序用户代理LSUIElement为True,以便在终止时将其自身添加到登录项中 问题 在helper应用程序进程终止之前,我无法运行任何代码。 我的添加到登录项代码运行良好 背景 我有一个一直运行的helper应用程序用户代理进程 在第一次启动时,它将自己添加到登录项中 如果在下次登录时移动了应用程序,则无法找到helper应用程序进程,因此不会启动 我试过的 我想知道是否应该将NSApplication子类化并覆盖terminate:

我想要什么

我希望Info.plist中的helper应用程序用户代理LSUIElement为True,以便在终止时将其自身添加到登录项中

问题

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

背景

我有一个一直运行的helper应用程序用户代理进程 在第一次启动时,它将自己添加到登录项中 如果在下次登录时移动了应用程序,则无法找到helper应用程序进程,因此不会启动 我试过的

我想知道是否应该将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日

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

这意味着当您选择退出活动监视器中的进程或关闭计算机时,不会调用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:?