Обнаружение, когда том монтируется в OS X

У меня есть приложение OS X, которое должно реагировать на монтируемый или размонтируемый том.

Я уже решил эту проблему, периодически получая список томов и проверяя изменения, но я хотел бы знать, есть ли лучший способ.


person Brian    schedule 13.09.2012    source источник


Ответы (4)


Зарегистрируйтесь в центре уведомлений, который вы получаете от [[NSWorkspace sharedWorkspace] notificationCenter], а затем обработайте интересующие вас уведомления. Это уведомления, связанные с объемом: NSWorkspaceDidRenameVolumeNotification, NSWorkspaceDidMountNotification, NSWorkspaceWillUnmountNotification и NSWorkspaceDidUnmountNotification.

person Analog File    schedule 13.09.2012

Подход NSWorkspace — это именно то, что я искал. Через несколько строк кода у меня есть гораздо лучшее решение, чем использование таймера.

-(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");
}
person Brian    schedule 13.09.2012

Свифт 4 версия:

Объявите NSWorkspace в applicationDidFinishLaunching и добавьте наблюдателей для событий монтирования и размонтирования.

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)

Захват событий монтирования и размонтирования в:

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

Он напечатает путь к устройству, например /Volumes/EOS_DIGITAL Вот константы, которые вы можете прочитать из userInfo.

NSDevicePath, 
NSWorkspaceVolumeLocalizedNameKey
NSWorkspaceVolumeURLKey
person mohacs    schedule 11.10.2017

Знаете ли вы SCEvents? Это позволяет получать уведомления об изменении содержимого наблюдаемой папки (/Volumes). Таким образом, вам не нужно использовать таймер для периодической проверки содержимого.

person DrummerB    schedule 13.09.2012
comment
Есть ли причина использовать это поверх NSWorkspace, как описано ниже? Это сторонняя библиотека, поэтому преимущества должны быть значительными, чтобы убедить меня добавить в проект дополнительную зависимость. - person Brian; 13.09.2012