2012-09-13 12 views
7

Tengo una aplicación OS X que necesita responder a un volumen que se monta o desmonta.Detectar cuando un volumen está montado en OS X

Ya he resuelto este problema recuperando periódicamente la lista de volúmenes y buscando cambios, pero me gustaría saber si hay una mejor manera.

Respuesta

10

Registro al centro de notificación que recibe de [[NSWorkspace sharedWorkspace] notificationCenter] y luego procesar las notificaciones que le interesan Estas son las relacionadas con el volumen: los. NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotification y NSWorkspaceDidUnmountNotification.

2

¿Conoces SCEvents? Le permite ser notificado cuando cambia el contenido de una carpeta observada (/Volumes). De esta forma, no tiene que usar un temporizador para verificar periódicamente los contenidos.

+0

¿Hay alguna razón para utilizar esto en NSWorkspace como se describe a continuación? Es una biblioteca de terceros, por lo que los beneficios tendrían que ser importantes para convencerme de agregar una dependencia adicional al proyecto. – Brian

15

El enfoque NSWorkspace es exactamente el tipo de cosa que estaba buscando. Algunas líneas de código más adelante, tengo una solución mucho mejor que usar un temporizador.

-(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 versión 4:

Declarar NSWorkspace en applicationDidFinishLaunching y añadir observadores de montaje y desmontar eventos.

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) 

montaje Captura y eventos desmontar en:

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

Se imprimirá la ruta del dispositivo por ejemplo/Volumes/EOS_DIGITAL Aquí son las constantes se pueden leer desde userInfo.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey 
NSWorkspaceVolumeURLKey 
Cuestiones relacionadas