繁体   English   中英

如何以编程方式从 FileProvider Extension (macOS) 打开文件

[英]How to programmatically open a file from FileProvider Extension (macOS)

有没有办法以编程方式从 FileProvider Extension 打开文件?

我的用例是我有适用于 macOS 的 FileProviderUI 扩展,它显示带有“打开文件”按钮的对话框。 我想当用户点击“打开文件”按钮打开相关文件时。

但是,当我执行时:

NSWorkspace.shared.open(itemURL)

显示 Finder 错误:应用程序“MyAppAction (Finder)”无权打开“My File.txt”。

我想这与 FileProviderExtension 被沙盒化有关,但是有没有办法以编程方式打开 FileProvider 文件?

以下是有关如何打开 FileProvider 文件夹的示例:

  1. 检索 FileProvider 根文件夹 URL:
let fileProviderFolderURL = try! await NSFileProviderManager(for: SREG.context.domain)?.getUserVisibleURL(for: .rootContainer)
  1. 使用NSOpenPanel询问用户将符号链接存储到 FileProvider 根文件夹的位置。 然后存储用户选择位置的书签数据,并在该位置创建指向 FileProvider 根目录的符号链接。
let savePanel = NSOpenPanel()
savePanel.canChooseDirectories = true
savePanel.title = "Choose this location"
savePanel.prompt = "Choose"

let result = await savePanel.begin()

if result == NSApplication.ModalResponse.OK {
    let panelURL = savePanel.url
    let mountBookmarkData = try! panelURL.bookmarkData(options: .withSecurityScope)
    UserDefaults.standard.set(mountBookmarkData, forKey: "aliasLocationBookmarkData")

    let fileManager = FileManager.default
    var aliasURL = panelURL.appendingPathComponent("MyRoot")

    UserDefaults.standard.set(aliasURL.path, forKey: Constants.UserDefaults.aliasPath)

    do {
        try fileManager.createSymbolicLink(at: aliasURL, withDestinationURL: fileProviderFolderURL)
    } catch {
        // handle error
    }

}
  1. 稍后,当您想在 Finder 中打开 Root 文件夹时,从UserDefaults中获取书签数据并从中创建 URL。 它是存储符号链接的位置。 开始对其进行安全访问,然后打开符号链接 URL:
let aliasLocationBookmarkData = UserDefaults.standard.data(forKey: "aliasBookmarkData")!
var isStale = false
let aliasLocationURL = try URL(resolvingBookmarkData: aliasLocationBookmarkData, options: .withSecurityScope, relativeTo: nil, bookmarkDataIsStale: &isStale)

let securityScopeResult = aliasLocationURL.startAccessingSecurityScopedResource()
if securityScopeResult {
    let aliasPathKey = Constants.UserDefaults.aliasPath
    let aliasPath = UserDefaults.standard.string(forKey: aliasPathKey)
    let aliasURL = URL(fileURLWithPath: aliasPath)
    
    NSWorkspace.shared.open(aliasURL)    

    aliasLocationURL.stopAccessingSecurityScopedResource()
}

差不多就是这样。 关键是存储用户在NSOpenPanel对话框中选择的位置的书签数据,在其中创建符号链接,然后即使在应用程序重新启动后您也可以访问该资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM