Swift macOS 沙盒上的文件读取权限错误

Swift file reading permission error on macOS sandbox

我正在尝试读取 macOS Swift 应用程序(Xcode 9 / Swift 4)中文件系统中文件的内容。

我为此使用了以下代码段:

let path = "/my/path/string.txt"
let s = try! String(contentsOfFile: path)
print(s)

我的问题如下:

  1. 这适用于 游乐场
  2. 这在我使用 命令行工具 macOS 应用程序模板
  3. 时有效
  4. 当我使用 Cocoa App macOS 应用程序模板
  5. 时出现权限错误而终止

权限错误如下:

Fatal error: 'try!' expression unexpectedly raised an error:

Error Domain=NSCocoaErrorDomain Code=257 "The file "data.txt" couldn't be opened because you don't have permission to view it."

UserInfo={NSFilePath=/my/path/data.txt, NSUnderlyingError=0x60c0000449b0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

我猜这与沙盒有关,但我没有找到相关信息。

  1. 如何在沙盒应用程序中读取文件系统?我的意思是有这么多的 GUI 应用程序需要一个打开文件对话框,它不能是沙盒应用程序不从沙盒外部读取文件的现实限制。

  2. 或者,如何在构建设置中关闭沙盒?

  3. 最后,我尝试比较默认 Cocoa 应用程序和命令行工具模板之间的 project.pbxproj 文件,我没有发现任何有意义的差异,比如关于安全或沙箱。如果不在这里,这些设置存储在哪里?

你的子弹1:你有答案,你需要使用NSOpenPanel获得用户访问文件的权限。您可以使用 NSOpenPanel 方法将用户的选择限制为取消按钮和您想要的文件 - 从而形成一个 "request access to" 对话框。从 Apple's App Sandbox Design Guide.

开始

你的要点 2:你的想法是对的,只是选项卡错误,你应该在“摘要”选项卡上找到沙盒开关。

HTH