【问题标题】: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
    相关资源
    最近更新 更多