swift 如何通过FileProvider扩展以编程方式打开文件(macOS)

vbopmzt1  于 2022-12-22  发布在  Swift
关注(0)|答案(1)|浏览(341)

有没有一种方法可以通过编程方式从FileProvider Extension打开文件?
我的用例是,我有FileProviderUI扩展的macOS,其中显示了一个对话框与“打开文件”按钮。我想当用户点击“打开文件”按钮打开相关文件。
但是,当我执行:

NSWorkspace.shared.open(itemURL)

显示Finder错误:* 应用程序“MyAppAction(Finder)”没有打开“My File.txt "的权限。*
我猜这与FileProviderExtension被沙箱化有关,但是有没有办法以编程方式打开FileProvider文件呢?

vuv7lop3

vuv7lop31#

以下是有关如何打开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对话框中选择的位置的书签数据,在其中创建符号链接,这样即使在应用程序重新启动后,你也可以访问该资源。

相关问题