我对沙盒有点困惑。这可能吗?
谢谢!
答案 0 :(得分:27)
是的,但它需要“临时例外”权利。 “临时”意味着它可能会在操作系统的某个未来版本中消失,但这并不是一个风险。更大的问题是“异常”一词:这意味着您必须证明您使用权利的合理性,或者App Store审核人员可能会拒绝您。
提交一份错误报告,准确解释您认为自己应该能够做什么,但今天无法访问~/Library
就无法做到,理想情况下也会在该主题上启动论坛帖子。他们可能会建议使用变通方法而不是访问~/Library
(甚至可能使用私有API),在这种情况下,按照他们的意思行事。或者他们可能会说现在使用临时例外,在这种情况下,这样做。或者他们可能没有回应,在这种情况下,您使用临时例外并交叉手指。在任何情况下,请确保您的App Store提交审核说明具有指向错误报告和/或论坛帖子的链接。
您必须手动编辑项目的权利plist才能执行此操作,但这并不是很难。创建一个com.apple.security.temporary-exception.files.home-relative-path.read-only
数组,其中包含一个字符串"/Library/"
。像这样:
<key>com.apple.security.temporary-exception.files.home-relative-path.read-only</key>
<array>
<string>/Library/</string>
</array>
最后的额外/
是沙盒知道您想要访问目录而不是文件的方式。如果你关闭它,你将可以访问~/Library
中所有文件,这是你要求的,但不能访问~/Library
的(递归)子目录中的文件,比如说{{1}这是你可能想要的。请参阅权利密钥参考文档中的File Access Temporary Extensions。
另外,请注意您已经“免费”访问~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist
下的某些内容,因为它们会被复制到您的容器中,或者在您使用适当的API而不是使用路径时间接访问。因此,可能有更好的方法来完成您正在做的事情 - 例如,要读取以前的非沙盒版本的应用程序留下的文件,您可以将它们迁移到容器中并在那里阅读。
还有一件事:只是访问〜/ Library不会改变~/Library
,NSHomeDirectory()
等将返回的内容 - 您仍会获得URLsForDirectory:inDomains:
。 Apple处理此问题的半官方建议是使用BSD API来获取用户的真实主目录,最简单的方法是:
~/Containers/com.mycompany.myproduct/Data/Library
一些注意事项:
const char *home = getpwuid(getuid())->pw_dir;
NSString *path = [[NSFileManager defaultManager]
stringWithFileSystemRepresentation:home
length:strlen(home)];
NSURL *url = [NSURL fileURLWithPath:path isDirectory:YES];
通常不是一个好主意。最好的解决方案是尽早调用此代码,然后缓存生成的getpwuid
。NSURL
)目录,但App Store几乎肯定不允许任何实际尝试的软件。Library
的事实被认为是“实施细节”,可能会在一天内发生变化,这是另一个原因(在权利之上),这必须被视为临时解决方案,直到Apple为您的高级问题提供了真正的解决方案,在您的评论中可能值得一提。