I'm trying to read the contents of a file on the filesystem in a macOS Swift app (Xcode 9 / Swift 4).
I'm using the following snippet for it:
let path = "/my/path/string.txt"
let s = try! String(contentsOfFile: path)
print(s)
My problem is the following:
- This works in a Playground
- This works when I use the Command Line Tool macOS app template
- This terminates in a permission error when I use the Cocoa App macOS app template
The permission error is the following:
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"}}
I guess it's related to sandboxing but I found no information about it.
How can I read from the filesystem in a sandboxed app? I mean there are so many GUI apps which need an Open File dialog, it cannot be a realistic restriction of sandboxed apps to not read files from outside the sandbox.
Alternatively, how can I switch off sandboxing in Build Settings?
Finally, I tried to compare the
project.pbxproj
files between the default Cocoa Apps and Command Line Tool template and I didn't see any meaningful difference, like something about security or sandbox. If not here, where are those settings stored?