2012-09-13 12 views
7

Ho un'applicazione OS X che deve rispondere a un volume montato o smontato.Rileva quando un volume è montato su OS X

Ho già risolto questo problema recuperando l'elenco di volumi periodicamente e controllando le modifiche, ma vorrei sapere se c'è un modo migliore.

risposta

10

Registra per il centro di notifica si ottiene da [[NSWorkspace sharedWorkspace] notificationCenter] e poi elaborare le notifiche che interessano Questi sono i relativi volumi di quelli:. NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotification e NSWorkspaceDidUnmountNotification.

2

Sapete SCEvents? Ti consente di essere avvisato quando il contenuto di una cartella osservata cambia (/Volumes). In questo modo non è necessario utilizzare un timer per controllare periodicamente il contenuto.

+0

C'è un motivo per utilizzare questo su NSWorkspace come descritto di seguito? È una libreria di terze parti, quindi i vantaggi dovrebbero essere significativi per convincermi ad aggiungere un'ulteriore dipendenza dal progetto. – Brian

15

L'approccio NSWorkspace è esattamente il tipo di cosa che stavo cercando. Dopo alcune righe di codice, ho una soluzione molto migliore rispetto all'utilizzo di un 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 Versione:

Dichiarare NSWorkspace in applicationDidFinishLaunching e aggiungere gli osservatori per il monte e gli eventi smontare.

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) 

montaggio Capture ed eventi smontare 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) 
    } 
} 

Si stamperà percorso del dispositivo es/Volumes/EOS_DIGITAL Qui ci sono le costanti che si può leggere da userInfo.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey 
NSWorkspaceVolumeURLKey 
Problemi correlati