![](/img/trans.png)
[英]How to programmatically open the app window from the background in SwiftUI on macOS (not iOS)?
[英]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 文件夹的示例:
let fileProviderFolderURL = try! await NSFileProviderManager(for: SREG.context.domain)?.getUserVisibleURL(for: .rootContainer)
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
}
}
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.