Mac应用程序如何确定用于启动它的方法?

时间:2011-04-28 00:46:35

标签: macos applescript launch nsapplication

我有一个Mac OS X应用程序也是一个协议处理程序(例如,Safari就是HTTP和HTTPS协议的协议处理程序)。因此,当用户在任何应用程序中单击myscheme:// some-kind-of-info形式的链接时,我的应用程序将启动以处理该链接。

现在,我需要能够确定应用程序是否通过此类链接单击启动,或者是否由任何其他方法启动。换句话说,它是通过链接点击之外的任何方法启动的。 (在这些情况下,我希望应用程序保持打开状态,但如果它是通过链接启动的,它应该退出并忽略链接。这样它只在已经运行时才会运行。)

启动时应用程序中是否有某种方式可以反省并发现它是由标准方法而不是AppleScript GetURL事件启动的?我想通过一个记录的方法找出,而不是 - 例如 - 让我的应用程序只在它运行半秒后打开这些链接。

1 个答案:

答案 0 :(得分:3)

您可以为启动时可能获得的每个Apple活动注册一个处理程序,并记下您首先收到的那个。

  • 如果在没有文档的情况下启动应用程序,您将获得kAEOpenApplication
  • 如果它与文档一起启动,您将获得kAEOpenDocuments(或 kAEPrintDocuments)。
  • 如果使用网址启动,那么(显然)您将获得kAEGetURL

还有kAEOpenContents,但我无法在我的测试应用中轻松触发它;无论如何,这都值得支持。

How Cocoa Applications Handle Apple Events记录了所有这些内容。

但是有一个错误;它说AppleScript的“发布”将发送kAEOpenApplication。它不会发送ascr/noopkASAppleScriptSuite / kASLaunchEvent,在ASRegistry.h中定义。我无法获得通常的Cocoa事件处理程序机制来捕获此事件,因此您可能需要在那里进行更多挖掘。

您可以检查在启动时是否发送事件的一种方法是在应用程序委托的applicationWillFinishLaunching:方法中注册事件处理程序;它们应该在调用applicationDidFinishLaunching:时传递。使用该方法,您可能检查kAEGetURL