4

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

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

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

4

1 回答 1

4

您可以为您将在发布时获得的每个可能的 Apple 事件注册一个处理程序,并记下您首先收到的事件。

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

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

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

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

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

于 2011-04-28T01:46:12.293 回答