2016-07-16 50 views
5

Vorrei sapere, da un'applicazione Swift, quando l'utente passa da un'applicazione all'altra, proprio in generale.monitoraggio commutazione applicazione su OS X

Per esempio: il passaggio da Google Chrome per un'applicazione diversa, come Xcode sarebbe attivare questo evento.

Esiste un modo per raccogliere applicazione switching eventi, come attraverso un evento monitorare forse?

risposta

6

È possibile aggiungere un osservatore su NSWorkspace.sharedWorkspace().notificationCenter per la chiave NSWorkspaceDidActivateApplicationNotification. Puntate il selettore su uno dei vostri metodi e prendete le informazioni dal dizionario userInfo.

semplice esempio nel AppDelegate:

Swift 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) 
    } 
} 

Swift 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

Grazie mille! –

+0

Prego. :) – Moritz

4

In Swift 3 è necessario utilizzare la parola chiave let per ogni legame opzionale. Inoltre, l'applicazione in esecuzione, come estratto dal dizionario userInfo, è di tipo any, e deve essere ulteriormente cast alla tipologia NSRunningApplication.

Quindi la risposta Swift 3 data da Eric Aya funziona, ma ha bisogno di piccole modifiche:

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) 
    } 
} 

(avrei lasciato questo post come commento alla risposta accettata, ma non abbastanza rep ...)

+0

Ci sono così tante modifiche così spesso in Swift, è difficile mantenere aggiornate le mie risposte. :) Grazie per il tuo contributo. – Moritz

+0

Sì, lo so! :) Era una soluzione banale, ma ho pensato che potrebbe far risparmiare tempo agli altri. E grazie per la tua risposta originale, è stato molto utile! – tin