究竟应该传递给什么 - [NSApp activateIgnoringOtherApps:]让我的应用程序与大多数其他OS X应用程序相比"自然地"启动?

and*_*abs 3 macos cocoa objective-c nsapplication launch-services

当我学会了如何自己启动NSApplications时,我使用的代码(基于此处此处)完成了

[NSApp activateIgnoringOtherApps:YES];
Run Code Online (Sandbox Code Playgroud)

这会在启动时强制应用程序到前端.

我想知道大多数其他应用程序的功能.我希望能够直接从二进制文件和应用程序包中运行程序,而且我没有使用Xcode来构建它(原始构建).所以我可以自然而然地说这种行为.

文档确实说Finder问题NO,但是......为什么Finder?这不是一个从流程内部运行的方法,而不是外部的方法吗?(我无法控制选择.)那么Doc​​k和其他可能的切入点呢?

我甚至竟然拆解10.8 NSApplicationMain()来看看它做了什么,但据我所知,从32位版本开始,除非这个"轻启动"事情发出这个选择器,否则这个选择器永远不会被调用.

这个问题有答案吗?谢谢......如果这令人困惑,我很抱歉; 我试着尽可能清楚地说出来.

Ken*_*ses 10

应用通常根本不打电话-activateIgnoringOtherApps:.而且,一般来说,不应该.当然,它不会出现NSApplicationMain(),这与实际的应用启动过早和相当远.

应用程序是由发射服务正常启动(这是用来通过测定器,底座和/usr/bin/open,以及任何其他应用程序,可能会打开你的还是你的哪一个处理文件).大致发生的事情是启动服务停用了调用它打开其他东西的应用程序,然后,在启动的应用程序中,Cocoa的内部执行类似(但不一定相同)的操作[NSApp activateIgnoringOtherApps:NO].这样,如果在这两个事件之间的间隔中没有激活任何其他内容,则启动的应用程序仅激活.如果该间隔很长(因为某些事情很慢)并且用户在此期间切换到了其他内容,那么您不希望从他们切换到的任何内容中窃取焦点.

您应该只[NSApp activateIgnoringOtherApps:YES]响应用户请求在上下文中激活您的应用程序,该上下文不包括Launch Services自动停用当前应用程序.例如,如果有其本身变换成GUI应用程序(使用命令行程序-[NSApplication setActivationPolicy:]或弃用TransformProcessType()),然后运行该工具的用户意味着他们想要激活它.但终端是活跃的,只是因为运行你的程序而不会自动停用.因此,该计划必须重点关注.

如果您的程序是捆绑的应用程序,那么应该从命令行运行它/usr/bin/open而不是直接执行bundle中的可执行文件.然后,你根本不需要打电话-activateIgnoringOtherApps:,要传递什么价值的问题没有实际意义.

  • 不可靠。启动服务曾经以`-psn_ <digits>`形式传递参数,但现在不再这样做了。当您从命令行调用*时,您可以传递特殊参数,并根据此行为有所不同。然后,您可以在应用程序中包含一个脚本,以使用这些参数调用其主要可执行文件,然后调用脚本而不是主要可执行文件。 (2认同)