2012-09-13 11 views
7

Mam aplikację OS X, która musi odpowiadać na zamontowany lub odłączony wolumin.Wykryj, kiedy wolumin jest zamontowany na OS X

Rozwiązałem już ten problem przez okresowe pobieranie listy woluminów i sprawdzanie zmian, ale chciałbym wiedzieć, czy jest lepszy sposób.

Odpowiedz

10

Rejestracja do centrum powiadamiania można uzyskać z [[NSWorkspace sharedWorkspace] notificationCenter] a następnie przetwarzać informację jesteś zainteresowany Są to te związane głośności. NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotification i NSWorkspaceDidUnmountNotification.

2

Czy znasz SCEvents? Pozwala na otrzymywanie powiadomień o zmianie zawartości obserwowanego folderu (/Volumes). W ten sposób nie trzeba używać stopera, aby okresowo sprawdzać zawartość.

+0

Czy istnieje powód, aby używać tego w NSWorkspace, jak opisano poniżej? Jest to biblioteka stron trzecich, więc korzyści będą musiały być znaczące, aby przekonać mnie do dodania dodatkowej zależności do projektu. – Brian

15

Podejście typu NSWorkspace jest dokładnie tym, czego szukałem. Kilka linii kodu później, mam o wiele lepsze rozwiązanie niż użycie timera.

-(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 wersja:

stwierdzenie NSWorkspace w applicationDidFinishLaunching i dodać obserwatorów na podłączanie i odłączanie zdarzeń.

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) 

Przechwytywanie podłączanie i odłączanie wydarzenia:

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

To będzie drukować ścieżkę urządzenia np/Volumes/EOS_DIGITAL Oto stałe można odczytać z userinfo.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey 
NSWorkspaceVolumeURLKey