【问题标题】:OS X FinderSync 'fails' for /Volumes/Volumes 的 OS X FinderSync“失败”
【发布时间】:2023-03-11 06:06:02
【问题描述】:

我正在创建一个简单的 OS X FinderSync,它将菜单项添加到所有文件的控制/右键单击菜单:

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

它对所有文件都很好用(出现菜单项等),除了那些在/Volumes 中的文件奇怪的是,如果我在/Volumes 中手动创建一个目录并在那里添加一些文件,右键单击时会出现 FinderSync 的菜单项。但是,对于任何已安装卷中的任何文件(即来自已安装的 .dmg),它都会失败:没有菜单项出现。

在directoryURLs 中直接指定一个挂载的卷同样失败:

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

others 似乎也有类似的问题,所以也许这是一个已知的错误/限制?

【问题讨论】:

  • 如果您找到了解决方案,您可以回答自己的问题。这将帮助其他有同样问题的人。
  • 仍然没有解决方案....对不起 :( 将再次 ping Apple!
  • 它是只挂载的 DMG 还是任何只读挂载的卷?我刚刚测试了一个可锁定的 USB 驱动器,当 USB 驱动器处于锁定模式和未锁定模式时,查找器选项会有所不同。
  • 遇到同样的问题,你是不是打开了 Apple 的 bug?

标签: objective-c operating-system findersync


【解决方案1】:

Finder Sync 扩展监控的文件夹集不跨越文件系统边界。 (虽然 Apple 的文档中没有明确提到这一点,但可以通过经验验证,并且在 macOS 10.13.3 中仍然如此)。

由于预期的用例是监视由 Dropbox 等同步实用程序维护的特定文件夹,因此 Apple 可能不会将此视为限制。然而,许多开发人员将 Finder Sync 扩展作为向 Finder 的顶级上下文菜单添加任意项目的一种方式(不受限于出现在服务子菜单中),即使这种用法是 explicitly discouraged by Apple:

确保 Finder Sync 扩展点适用于 您计划提供的功能。最好的 Finder 同步扩展 支持将本地文件夹内容与远程同步的应用程序 数据源。 Finder Sync 并非旨在作为通用工具 修改 Finder 的用户界面。

要解决此限制并使扩展程序的菜单项可用于 Finder 中可见的任何项目,有必要执行以下操作:

  1. 扫描所有可见的挂载卷,并初始化 FIFinderSyncController 对象的 directoryURLs 属性 结果:

    import FinderSync
    
    let finderSync = FIFinderSyncController.default()
    if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil,
                                                                  options: .skipHiddenVolumes) {
        finderSync.directoryURLs = Set<URL>(mountedVolumes)
    }
    
  2. 由于 Finder Sync 扩展是长期存在的进程,因此请注册 用于安装、卸载和重命名卷的通知, 并相应地更新directoryURLs:

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

    (处理卸载和重命名通知留作练习 供读者阅读。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多