2012-09-13 14 views
7

Ich habe eine OS X-Anwendung, die auf ein Volume antworten muss, das eingehängt oder ausgehängt wird.Erkennen, wenn ein Volume unter OS X gemountet wird

Ich habe dieses Problem bereits gelöst, indem ich regelmäßig die Liste der Volumes abrufe und nach Änderungen suche, aber ich würde gerne wissen, ob es einen besseren Weg gibt.

Antwort

10

Register zum Notification Center Sie von [[NSWorkspace sharedWorkspace] notificationCenter] erhalten und verarbeiten dann die Benachrichtigungen Sie interessiert: Es sind die Volumen bezogen sind:. NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotification und NSWorkspaceDidUnmountNotification.

2

Kennen Sie SCEvents? Sie können benachrichtigt werden, wenn sich der Inhalt eines überwachten Ordners ändert (/Volumes). Auf diese Weise müssen Sie keinen Timer verwenden, um den Inhalt regelmäßig zu überprüfen.

+0

Gibt es einen Grund, diese über NSWorkspace wie unten beschrieben zu verwenden? Es ist eine 3rd-Party-Bibliothek, also müssten die Vorteile erheblich sein, um mich davon zu überzeugen, dem Projekt eine zusätzliche Abhängigkeit hinzuzufügen. – Brian

15

Der NSWorkspace Ansatz ist genau die Art von was ich suchte. Ein paar Zeilen Code später habe ich eine viel bessere Lösung als mit einem Timer.

-(void) monitorVolumes 
{ 
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(volumesChanged:) name:NSWorkspaceDidMountNotification object: nil]; 
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector: @selector(volumesChanged:) name:NSWorkspaceDidUnmountNotification object:nil]; 
} 

-(void) volumesChanged: (NSNotification*) notification 
{ 
    NSLog(@"dostuff"); 
} 
1

Swift 4 Version:

Deklarieren NSWorkspace in applicationDidFinishLaunching und fügen Beobachter für mount und unmount Veranstaltungen.

let workspace = NSWorkspace.shared 

workspace.notificationCenter.addObserver(self, selector: #selector(didMount(_:)), name: NSWorkspace.didMountNotification, object: nil) 
workspace.notificationCenter.addObserver(self, selector: #selector(didUnMount(_:)), name: NSWorkspace.didUnmountNotification, object: nil) 

Erfassung ein- und aushängen Veranstaltungen in:

@objc func didMount(_ notification: NSNotification) { 
    if let devicePath = notification.userInfo!["NSDevicePath"] as? String { 
     print(devicePath) 
    } 
} 
@objc func didUnMount(_ notification: NSNotification) { 
    if let devicePath = notification.userInfo!["NSDevicePath"] as? String { 
     print(devicePath) 
    } 
} 

Es Gerätepfad drucken z/Volumes/EOS_DIGITAL Hier sind die Konstanten, die Sie von userinfo lesen kann.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey 
NSWorkspaceVolumeURLKey 
Verwandte Themen