Swift 在沙盒模式下执行命令行命令

Swift Execute command line command in Sandbox mode

目前我正在尝试着手 Swift 编程。我尝试从我的 macOS Swift 应用程序 中执行命令行命令。没有将我的应用程序设置为沙箱,一切正常。但由于我激活了沙箱,该命令将不再有效,但不会抛出任何错误并以状态代码 0 终止。

所以最简单的用例是从我的应用程序启动 VSCode

负责执行shell命令的方法如下:

 func executeUserCommand(command: String, args: [String]?) -> Int32{
        let task = Process()
        task.launchPath = "/usr/local/bin/" + command
        task.arguments = args
        task.launch()
        task.waitUntilExit()
        return task.terminationStatus
    }
}

所以如果我想开始 VSCode 我调用 executeUserCommand("code", ["."]) 在当前目录中打开 VSCode

在我启用 Xcode 中的 App Sandbox 之前,它工作正常。我清理并重建应用程序,但现在 VSCode 根本没有启动,但终止状态为 0。我很确定沙箱限制了对 /usr/local/bin 目录的访问。

有什么方法可以让我的应用程序只能访问这个特定的文件夹吗?这样用户就可以授予我的应用程序访问该文件夹一次,然后应用程序可以访问该文件夹,即使在应用程序重新启动后也是如此?

提前致谢

Yeah, I already thought so, but I was thinking about if it is possible to explicitly ask the user to give the application the permission for this specific folder

您的思考方向是正确的。显然,如果沙盒应用程序无法访问文件和文件夹,它们将毫无用处,而它们这样做的关键是用户授予它们权限。此权限是使用标准打开和保存对话框授予的,当用户 select 是 file/folder 应用程序被授予 read/write/create 权限时。

需要访问特定的 file/folder?自定义打开的对话框以引导用户 select 那个特定的 file/folder,并检查结果以确保他们有 - 处理他们选择不处理的情况。

希望您的应用程序在启动后保留用户授予的对 file/folder 的访问权限?然后您需要创建并存储一个 安全范围书签

是时候阅读一些内容了,如果您遇到困难,请提出一个新问题,毫无疑问会有人帮助您。记得展示你的发现,你写的代码等等

HTH