`NSTask.run()` 失败并显示 `操作无法完成。权限被拒绝`

问题描述 投票:0回答:1

我正在尝试从 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)")
  }
}
macos swiftui appkit
1个回答
0
投票
  • /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)
    }
}

请注意,这不应位于沙箱中。

© www.soinside.com 2019 - 2024. All rights reserved.