Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Objective c 我应该传递给-[NSApp activateIgnoringOtherApps:]什么才能启动我的应用程序;自然地;与大多数其他OS X应用程序相比?_Objective C_Macos_Cocoa_Nsapplication_Launch Services - Fatal编程技术网

Objective c 我应该传递给-[NSApp activateIgnoringOtherApps:]什么才能启动我的应用程序;自然地;与大多数其他OS X应用程序相比?

Objective c 我应该传递给-[NSApp activateIgnoringOtherApps:]什么才能启动我的应用程序;自然地;与大多数其他OS X应用程序相比?,objective-c,macos,cocoa,nsapplication,launch-services,Objective C,Macos,Cocoa,Nsapplication,Launch Services,当我学会如何自己启动非应用程序时,我使用的代码(基于and)成功了 这会在启动时将应用程序推到前端 我想知道大多数其他应用程序都做些什么。我希望能够直接从二进制文件和应用程序包运行程序,而不是使用Xcode来构建(原始构建)。所以可以说,我宁愿这是自然的行为 文档确实说Finder发布了否,但是。。。为什么是Finder?这不是一个从流程内部而不是外部运行的方法吗?(我不能控制选择。)那么码头和其他可能的入口呢 我甚至对10.8的NSApplicationMain()进行了反汇编,看看它做了什么

当我学会如何自己启动非应用程序时,我使用的代码(基于and)成功了

这会在启动时将应用程序推到前端

我想知道大多数其他应用程序都做些什么。我希望能够直接从二进制文件和应用程序包运行程序,而不是使用Xcode来构建(原始构建)。所以可以说,我宁愿这是自然的行为

文档确实说Finder发布了
,但是。。。为什么是Finder?这不是一个从流程内部而不是外部运行的方法吗?(我不能控制选择。)那么码头和其他可能的入口呢

我甚至对10.8的
NSApplicationMain()
进行了反汇编,看看它做了什么,但从32位版本来看,除非这个“轻启动”的东西发出了这个选择器,否则这个选择器永远不会被调用


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

应用程序通常不会调用
-activateIgnoringOtherApps:
。而且,一般来说,不应该。当然,它不会出现在
NSApplicationMain()
中,因为它太早了,而且与实际的应用程序启动关系还很遥远

应用程序通常由Launch Services启动(Finder、Dock和
/usr/bin/open
,以及任何其他可能打开您的应用程序或您处理的文档所使用的应用程序)。大致情况是,Launch Services会停用调用它以打开其他内容的应用程序,然后在已启动的应用程序中,Cocoa的内部功能类似于(但不一定相同)
[NSApp activateIgnoringOtherApps:NO]
。这样,启动的应用程序只有在两个事件之间没有激活其他内容时才会激活。如果这个时间间隔很长(因为某个时间比较慢),而用户同时切换到了另一个时间间隔,那么你就不想从他们切换到的任何地方窃取焦点

您应该只调用
[NSApp activateIgnoringOtherApps:YES]
以响应用户请求,在不包括通过启动服务自动停用当前应用的上下文中激活您的应用。例如,如果您有一个将自身转换为GUI应用程序的命令行程序(使用
-[NSApplication setActivationPolicy:
或不推荐使用的
TransformProcessType()
),则运行该工具的用户表示他们希望它处于活动状态。但终端是活动的,不会仅仅因为运行了您的程序而自动停用。所以,程序必须窃取焦点


如果您的程序是捆绑应用程序,那么从命令行运行它应该使用
/usr/bin/open
完成,而不是直接在捆绑包中执行可执行文件。然后,你根本不需要调用
-activateIgnoringOtherApps:
,传递什么值的问题是没有意义的。

啊,谢谢你的解释(比我目前找到的更好)。所以我认为没有办法区分直接从终端启动的应用程序和由Launch Services启动的应用程序之间的区别?不可靠。过去的情况是,Launch Services传递了一个形式为
-psn
的参数,但现在它不再传递了。您可以在从命令行调用时传递特殊参数,并根据这些参数进行不同的行为。然后,您可以在应用程序中包含一个脚本,用这些参数调用其主可执行文件,并调用该脚本而不是主可执行文件。
[NSApp activateIgnoringOtherApps:YES];