pat*_*ick 9 operating-system objective-c findersync
我正在创建一个简单的OS X FinderSync,它将菜单项添加到所有文件的控件/右键单击菜单中:
[FIFinderSyncController defaultController].directoryURLs = [NSSet setWithObject:[NSURL fileURLWithPath:@"/"]];
Run Code Online (Sandbox Code Playgroud)
对于所有文件都很好(菜单项出现等),除了 Oddly中的那些文件,/Volumes如果我手动创建一个目录/Volumes并在那里添加一些文件,当我右键单击时会出现FinderSync的菜单项.但是对于任何已安装的卷中的任何文件(即来自已安装的.dmg),它都会失败:不显示任何菜单项.
在directoryURLs类似的情况下直接指定已安装的卷失败:
[FIFinderSyncController defaultController].directoryURLs = [NSSet setWithObject:[NSURL fileURLWithPath:@"/Volumes/SomeMountedDMG"]];
Run Code Online (Sandbox Code Playgroud)
似乎其他人有类似的问题,所以这可能是一个已知的错误/限制?
Finder Sync扩展名监视的文件夹集不会跨越文件系统边界。(尽管在Apple文档中没有明确提及,但可以凭经验进行验证,从macOS 10.13.3开始仍然适用)。
由于预期的用例是监视由Dropbox等同步实用程序维护的特定文件夹,因此Apple可能不会将此视为限制。但是,许多开发人员都实现了Finder Sync扩展,以将任意项添加到Finder的顶级上下文菜单中的方式(而不是限制显示在“服务”子菜单中),即使Apple明确不建议使用此方法:
确保Finder同步扩展点适合您计划提供的功能。最好的Finder Sync扩展程序支持将本地文件夹的内容与远程数据源同步的应用程序。Finder Sync不能用作修改Finder用户界面的通用工具。
要变通解决此限制,并使扩展程序的菜单项可用于在Finder中可见的任何项目,必须执行以下操作:
扫描所有可见的已安装卷,并将对象的directoryURLs属性初始化
FIFinderSyncController为结果:
import FinderSync
let finderSync = FIFinderSyncController.default()
if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil,
options: .skipHiddenVolumes) {
finderSync.directoryURLs = Set<URL>(mountedVolumes)
}
Run Code Online (Sandbox Code Playgroud)由于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)
}
}
Run Code Online (Sandbox Code Playgroud)
(处理卸载和重命名通知留给读者练习。)
| 归档时间: |
|
| 查看次数: |
888 次 |
| 最近记录: |