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

Sco*_*ine 4 macos applescript launch nsapplication

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

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

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

Nic*_*ley 5

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

  • 如果应用程序在没有文档的情况下启动,您将获得kAEOpenApplication.
  • 如果它是通过文档启动的,您将得到kAEOpenDocuments(或 kAEPrintDocuments)。
  • 如果它是通过 URL 启动的,那么(显然)你会得到kAEGetURL.

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

《Cocoa 应用程序如何处理 Apple 事件》记录了所有这些内容。

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

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