我正在尝试从 macOS 上的 SwiftUI 应用程序中打开文本文档。
不幸的是,我收到错误
The operation couldn’t be completed. Permission denied
。 我该如何解决这个问题?
我尝试启用沙箱并访问下载文件夹(文件实际所在的位置)并使用沙箱disabled – 产生相同的结果。
使用
open ~/Downloads/Test.exampletext -a /System/Applications/TextEdit.app
在终端中打开文件完全有效。我交给func的url
是正确的,和上面说的一样。
代码如下:
func openFileViaTerminal(_ url: URL) {
guard let texteditURL = getTextEditURL()
else { return }
let shellProcess = Process()
shellProcess.launchPath = "/usr/bin"
shellProcess.arguments = [
"open \(url.path()) -a \(texteditURL.absoluteString)"
]
do {
try shellProcess.run()
} catch {
AppLogger.standard.error("\(error.localizedDescription)")
}
}
/usr/bin
不是可执行文件 - 它是一个目录。您应该将 launchPath
设置为可执行文件的路径,而不是其所在目录。arguments
数组的三个单独元素传递。absoluteString
为您提供一个表示 URL 的字符串,但 open
需要 paths。您应该执行 texteditURL.path(...)
,就像您对 url
参数执行的操作一样。open
理解百分比编码,所以你应该使用.path(percentEncoded: false)
。考虑到所有这些,你可以写:
func openFileViaTerminal(_ url: URL) {
let texteditURL = URL(filePath: "/System/Applications/TextEdit.app")
let shellProcess = Process()
shellProcess.launchPath = "/usr/bin/open"
shellProcess.arguments = [
url.path(percentEncoded: false), "-a", texteditURL.path(percentEncoded: false)
]
do {
try shellProcess.run()
} catch {
print(error)
}
}
请注意,这不应位于沙箱中。