2016-07-20 10 views
8

Я создаю простой OS X FinderSync, который добавляет пункт меню в меню управления/правая кнопка мыши для всех файлов:OS X FinderSync «терпит неудачу» для/Volumes

[FIFinderSyncController defaultController].directoryURLs = [NSSet setWithObject:[NSURL fileURLWithPath:@"/"]]; 

Это работает прекрасно (пункт меню появляется и т. д.) для всех файлов, за исключением тех, кто находится в /Volumes Как ни странно, если я вручную создаю каталог в /Volumes и добавлю туда некоторые файлы, пункт меню FinderSync появляется, когда я нажимаю правой кнопкой мыши. Однако для любых файлов в любых смонтированных томах (т. Е. Из смонтированного .dmg) он не работает: элемент меню не отображается.

непосредственно указав установленный объем в directoryURLs тоже ошибочна:

[FIFinderSyncController defaultController].directoryURLs = [NSSet setWithObject:[NSURL fileURLWithPath:@"/Volumes/SomeMountedDMG"]]; 

Кажется others имели схожие проблемы, поэтому, возможно, это известная ошибка/ограничение?

+2

Если вы нашли решение, вы можете ответить на него самостоятельно. Это поможет другим, имеющим такую ​​же проблему. – Tushar

+0

еще нет решения .... извините :(Будет пинг Apple снова! – patrick

+0

Является ли это только смонтированным DMG или это какой-либо только установленный том? Я только что проверил блокируемый USB-накопитель, и параметры поиска различны, когда USB-накопитель находится в режиме блокировки и разблокирован. – CraneStyle

ответ

1

набор папок, отслеживаемых расширением Finder синхронизации делать не выходит за границы файловой системы (хотя это не упоминается в документации Apple, она может быть проверена эмпирически и по-прежнему верно, как в MacOS 10.13.3).

Поскольку предполагаемый прецедент предназначен для наблюдения за конкретными папками, поддерживаемыми утилитами синхронизации, такими как Dropbox, предположительно Apple не видит в этом ограничений. Тем не менее, многие разработчики реализовать расширения Finder Синхронизировать как способ добавления произвольных элементов в контекстном меню верхнего уровня в Finder (не будучи стесненным появляться в подменю Services), даже если это использование explicitly discouraged by Apple:

Убедитесь, что точка расширения Finder Sync подходит для функций , которые вы планируете предоставить. Лучшие расширения Finder Sync поддерживают приложения, которые синхронизируют содержимое локальной папки с удаленным источником данных . Finder Sync не предназначен как обычный инструмент для , изменяющий пользовательский интерфейс Finder.

Чтобы обойти это ограничение и сделать пункт меню удлиняющей, имеющихся в наличии для любого элемента видимого в Finder, необходимо сделать следующее:

  1. Scan для всех видимых подключенных томов и инициализации directoryURLs свойство FIFinderSyncController объекта результат:

    let finderSync = FIFinderSyncController.default() 
    if let mountedVolumes == FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, 
                       options: [.skipHiddenVolumes]) { 
        finderSync.directoryURLs = Set<URL>(mountedVolumes) 
    } 
    
  2. Поскольку расширения Finder синхронизации являются долгоживущие процессы, регистрировать для уведомлений об объемах монтируется, демонтирована, и переименован, и обновить directoryURLs соответственно:

    let notificationCenter = NSWorkspace.shared().notificationCenter 
    notificationCenter.addObserver(forName: .NSWorkspaceDidMount, object: nil, queue: .main) { (notification) in 
        if let volumeURL = notification.userInfo?[NSWorkspaceVolumeURLKey] as? URL { 
         finderSync.directoryURLs.insert(volumeURL) 
        } 
    } 
    

    (Handling размонтирования и переименовывать уведомления остается в качестве упражнения для the reader.)