2011-04-28 60 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

相關問題