2016-11-18 4 views
2

Ich entwickle gerade ein Dienstprogramm, das erfordert, dass der Finder neu gestartet wird, nachdem einige Änderungen an den Standardeinstellungen des Benutzers vorgenommen wurden.Ermitteln, ob der Finder sicher beendet werden kann

Um auf der sicheren Seite zu sein, würde ich gerne überprüfen, ob der Finder beschäftigt ist, bevor Sie killall Finder anrufen (über NSTask). Wenn der Finder Dateien kopiert oder anderweitig beschäftigt ist, möchte ich die Aktion verhindern und ein wenig warten.

Gibt es eine Möglichkeit zu bestimmen, ob der Finder in Swift 2.3 auf macOS 10.10+ beschäftigt ist oder ob er sicher gelöscht werden kann?

Falls dies nicht möglich ist, gibt es eine sicherere Möglichkeit für mich, den Finder zu aktualisieren (neu zu starten)?

Danke!

+0

Sind Sie sicher, dass Sie es gewaltsam töten wollen, anstatt eine sogar beenden senden t gefolgt von einem aktivieren? – dfri

+0

Ich wusste nicht, dass das eigentlich möglich ist. Soll ich AppleScript dafür benutzen? Kannst du ein Beispiel als Antwort posten? Das würde mir helfen – beeb

+1

Sehen Sie, ob [diese Antwort] (http://stackoverflow.com/a/10226948/4573247) Ihnen helfen kann (obj-C, Cocoa). Alternativ können Sie mit AppleScript überprüfen, ob [diese Antwort] (http://stackoverflow.com/a/1462686/4573247) Ihnen helfen kann (obj-C, AppleScript). – dfri

Antwort

0

Dank @dfris Kommentar war ich in der Lage, einen Weg zu finden (wenn auch nicht genau der in der verknüpften Antwort).

Da die Beobachtung der NSRunningApplication Objekt für den Finder nicht möglich war (das Objekt war deinit aus Anlass der Beendigung ialized, bevor ich den Beobachter entfernen konnte), landete ich NSWorkspaceDidTerminateApplicationNotification von NSWorkspace.sharedWorkspace().notificationCenter

NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: #selector(MyController.applicationWasTerminated(_:)), name: NSWorkspaceDidTerminateApplicationNotification, object: nil) 

Beobachtung kann ich dann entfernen dieser Beobachter, wenn mein Controller deinit ialized, und der Wähler sieht wie folgt aus:

func applicationWasTerminated(notification: NSNotification?) { 
    guard let notif = notification else { return } 
    guard let userInfo = notif.userInfo as? [String : AnyObject] else { return } 
    guard let identifier = userInfo["NSApplicationBundleIdentifier"] as? String else { return } 
    if identifier == "com.apple.finder" { 
     NSWorkspace.sharedWorkspace().launchAppWithBundleIdentifier("com.apple.finder", options: NSWorkspaceLaunchOptions.Default, additionalEventParamDescriptor: nil, launchIdentifier: nil) 
    } 
} 
Verwandte Themen