我正在尝试在macOS Swift应用程序(Xcode 9 / Swift 4)中读取文件系统上的文件内容 .
我正在使用以下代码段:
let path = "/my/path/string.txt"
let s = try! String(contentsOfFile: path)
print(s)
我的问题如下:
-
这适用于 Playground
-
这在我使用 Command Line Tool macOS应用程序模板时有效
-
当我使用 Cocoa App macOS应用程序模板时,这会终止权限错误
权限错误如下:
致命错误:'试试!'表达式意外地引发了错误:错误Domain = NSCocoaErrorDomain Code = 257“无法打开文件”data.txt“,因为您没有权限查看它 . ” UserInfo = {NSFilePath = / my / path / data.txt,NSUnderlyingError = 0x60c0000449b0 }
我猜这与沙盒有关但我没有找到有关它的信息 .
-
如何从沙盒应用程序中读取文件系统?我的意思是有很多GUI应用程序需要一个打开文件对话框,它不能真正限制沙盒应用程序不能从沙箱外读取文件 .
-
或者,如何在Build Settings中关闭沙盒?
-
最后,我尝试比较默认Cocoa应用程序和命令行工具模板之间的
project.pbxproj
文件,我没有看到任何有意义的差异,比如安全性或沙箱 . 如果不在这里,那些设置存储在哪里?
1 回答
你的子弹1:你有答案,你需要使用
NSOpenPanel
来获得用户访问该文件的权限 . 您可以使用NSOpenPanel
方法将用户选择限制为取消按钮,只限制您希望的文件 - 从而创建一个"request access to"对话框 . 从Apple's App Sandbox Design Guide开始 .你的子弹2:你有正确的想法,只是错误的标签,你应该在摘要标签上找到沙盒开关 .
HTH