2016-07-16 28 views
5

我想從Swift應用程序中知道用戶從一個應用程序更改爲另一個應用程序時的情況。在OS X上監視應用程序切換

例如:從Google Chrome切換到其他應用(如Xcode)會觸發此事件。

有沒有什麼辦法來提取應用程序切換事件,比如通過事件監視器呢?

回答

6

您可以在NSWorkspace.sharedWorkspace().notificationCenter上添加觀察者,觀察NSWorkspaceDidActivateApplicationNotification密鑰。您將選擇器指向您的某個方法,並從userInfo字典中獲取信息。在AppDelegate中

簡單的例子:

雨燕2.2

func applicationDidFinishLaunching(notification: NSNotification) { 
    NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, 
                 selector: #selector(activated), 
                 name: NSWorkspaceDidActivateApplicationNotification, 
                 object: nil) 
} 

func activated(notification: NSNotification) { 
    if let info = notification.userInfo, 
     app = info[NSWorkspaceApplicationKey], 
     name = app.localizedName { 
      print(name) 
    } 
} 

斯威夫特3

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    NSWorkspace.shared().notificationCenter.addObserver(self, 
                 selector: #selector(activated(_:)), 
                 name: NSNotification.Name.NSWorkspaceDidActivateApplication, 
                 object: nil) 
} 

func activated(_ notification: NSNotification) { 
    if let info = notification.userInfo, 
     let app = info[NSWorkspaceApplicationKey] as? NSRunningApplication, 
     let name = app.localizedName 
    { 
     print(name) 
    } 
} 
+0

非常感謝! –

+0

不客氣。 :) – Moritz

4

在斯威夫特3,您需要使用關鍵字let每個可選綁定。另外,正在從userInfo字典中提取的正在運行的應用程序的類型爲any,並且需要進一步轉換爲NSRunningApplication類型。

所以由Eric綾給雨燕3答案工作,但需要小的修改:

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    NSWorkspace.shared().notificationCenter.addObserver(self, 
                 selector: #selector(activated), 
                 name: NSNotification.Name.NSWorkspaceDidActivateApplication, 
                 object: nil) 
} 

func activated(notification: NSNotification) { 
    if let info = notification.userInfo, 
     let app = info[NSWorkspaceApplicationKey] as? NSRunningApplication, 
     let name = app.localizedName { 
      print(name) 
    } 
} 

(我早就離開這個職位作爲公認的答案評論,但沒有足夠的代表...)

+0

在Swift中經常發生如此多的變化,我的答案很難保持更新。 :) 感謝您的貢獻。 – Moritz

+0

是的,我知道! :)這是一個微不足道的解決方案,但我認爲這可能會爲他人節省一些時間。感謝您的原始答覆,這非常有幫助! – tin