2016-07-20 34 views
8

tworzę prosty OS X FinderSync który dodaje element menu do menu sterowania/prawym przyciskiem myszy dla wszystkich plików:OS X FinderSync 'nie' dla/Volumes

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

To działa świetnie (the pojawia się element menu itp.) dla wszystkich plików, z wyjątkiem tych w /Volumes Co dziwne, jeśli ręcznie utworzę katalog w /Volumes i dodaję tam niektóre pliki, pozycja menu FinderSync pojawi się po kliknięciu prawym przyciskiem myszy. Jednak w przypadku plików we wszystkich zamontowanych woluminach (tj. Od zamontowanego pliku .dmg), nie powiedzie się: nie pojawia się element menu.

Bezpośrednio określając zamontowany wolumin w directoryURLs podobnie zawiedzie:

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

Wydaje others mieli podobne problemy, więc może jest to znany bug/ograniczenie?

+2

Jeśli znalazłeś rozwiązanie, możesz odpowiedzieć na własne pytanie. Pomoże to innym osobom mającym ten sam problem. – Tushar

+0

nadal nie ma rozwiązania .... przepraszam :(Ponownie ping Apple! – patrick

+0

Czy jest to tylko DMG lub jest to dowolny wolumin montowany tylko do odczytu? Właśnie przetestowałem blokowany dysk USB, a opcje wyszukiwania są znacznie inne, gdy dysk USB jest w trybie zablokowanym, a nie odblokowany. – CraneStyle

Odpowiedz

1

Zestaw folderów monitorowanych przez rozszerzenie Finder Sync zrobić nie przekraczać granice systemu plików (chociaż nie jest to wyraźnie wskazane w dokumentacji firmy Apple, może być zweryfikowane empirycznie i nadal jest prawdą, jak MacOS 10.13.3).

Ponieważ zamierzonym zastosowaniem jest monitorowanie określonych folderów obsługiwanych przez narzędzia synchronizacji, takie jak Dropbox, prawdopodobnie firma Apple nie uważa tego za ograniczenie. Jednak wielu deweloperów wdrożenia rozszerzeń Finder Sync jako sposób dodawania dowolnych elementów do menu kontekstowego najwyższego poziomu w Finderze (bez ograniczane do stawienia się w podmenu Services), chociaż to użycie jest explicitly discouraged by Apple:

Upewnij się, że punkt rozszerzenia synchronizacji Finder jest odpowiedni dla funkcji , którą chcesz udostępnić. Najlepsze rozszerzenia Finder Sync obsługują aplikacje, które synchronizują zawartość lokalnego folderu ze zdalnym źródłem danych . Finder Sync nie jest ogólnym narzędziem służącym do modyfikowania interfejsu użytkownika Findera przez .

Aby obejść to ograniczenie i uczynić element menu Rozszerzenie jest dostępne dla każdego elementu widocznego w Finderze, konieczne jest wykonanie następujących czynności:

  1. skanowania dla wszystkich widoczne zamontowane woluminy i zainicjować własność obiektu FIFinderSyncController do wynikiem directoryURLs:

    let finderSync = FIFinderSyncController.default() 
    if let mountedVolumes == FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil, 
                       options: [.skipHiddenVolumes]) { 
        finderSync.directoryURLs = Set<URL>(mountedVolumes) 
    } 
    
  2. Ponieważ rozszerzenia Finder Sync są procesy długowieczne, zarejestruj dla powiadomień o objętości osadzonym, nieoprawione, i przemianowany, i aktualizować directoryURLs odpowiednio:

    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 zdejmowania i zmienić powiadomienia są pozostawione jako ćwiczenie dla czytnik.)