2011-04-28 25 views
3

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

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

应用程序中是否有某种方式在启动时进行内省并发现它是由标准方法而不是AppleScript GetURL事件启动的?我想通过文档化的方法找出问题,而不是 - 例如 - 只需要我的应用程序在运行半秒后才打开这些链接。

回答

3

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

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

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

How Cocoa Applications Handle Apple Events文件所有这些东西。

虽然有一个错误,它表示AppleScript的“发布”将发送kAEOpenApplication。它不会,它会发送ascr/noopkASAppleScriptSuite/kASLaunchEvent,在ASRegistry.h中定义)。我无法得到通常的Cocoa事件处理机制来捕获这个事件,所以你可能需要在那里做更多的挖掘。

您可以在启动时检查事件是否发送的一种方法是在应用程序代理的applicationWillFinishLaunching:方法中注册事件处理程序;他们应该在调用applicationDidFinishLaunching:之前交付。用这种方法,你可能只有检查kAEGetURL

+0

我发现了一个我的特例的速记解决方案。我的应用在'NSScriptCommand'的子类中实现'performDefaultImplementation'来接收和处理URL。这个选择器在'applicationWillFinishLaunching'之后但在'applicationDidFinishLaunching'之前被触发......所以,就我而言,我只是在处理URL之前测试'applicationDidFinishLaunching'是否被触发。 – 2011-04-29 16:25:25

+1

是的,这几乎是我在我的答案的最后一句话中所暗示的。很高兴你明白了。 – 2011-04-29 16:30:35

+0

*如果我在应用程序委托中安装事件处理程序而不是使用'NSScriptCommand',我想我可以在'applicationDidFinishLaunching'中安装事件处理程序以获得相同的结果。 – 2011-04-29 16:31:45

相关问题