我在 Xcode 中有一个项目,它在没有启用沙箱的情况下正常工作,但我希望在 Mac App Store 上发布,所以我需要启用沙箱。
我的应用程序需要写入另一个应用程序的
~/Library/Application Support
文件夹,因此我将临时文件例外添加到权利文件中 - 但它似乎不起作用。
这是一些细节:
.entitlements
文件有一个 com.apple.security.temporary-exception.files.home-relative-path.read-write
的数组条目。它有一个子项,一个字符串当前设置为“/”(出于测试目的 - 一旦我让它工作,我将缩小范围);我使用以下内容设置我的写作 URL,然后向其附加适当的路径组件:
let applicationSupportURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first
尽管如此,我看到我的应用程序正在内部执行操作
/Users/<username>/Library/Containers/<appID>/Data/Library/Application Support/
...我在 macOS 10.13.6 下运行 Xcode 9.4.1。
有什么想法吗?
启用沙箱后,FileManager 返回相对于应用程序容器的路径,而不是用户的真实主目录。
奎因“爱斯基摩人!”建议使用
getpwuid
来获取用户的真实主目录,如下所示:
func realHomeDirectory() -> URL? {
guard let pw = getpwuid(getuid()) else { return nil }
return URL(fileURLWithFileSystemRepresentation: pw.pointee.pw_dir, isDirectory: true, relativeTo: nil)
}
这将允许访问通过
com.apple.security.temporary-exception.files.home-relative-path.*
配置的路径,但这些例外可能不会得到 App Store 审核的批准。
接下来我们来说说App Review。首先,请注意,我不为应用程序审核工作,因此我无法代表他们做出明确的声明。不过,我的理解是,App Review 会仔细审核任何使用文件访问临时异常的情况。我怀疑你能否让他们相信你的例外是合理的。