14

我对沙盒有点困惑。这可能吗?

谢谢!

4

1 回答 1

35

是的,但它需要“临时例外”权利。“临时”意味着它可能会在操作系统的某些未来版本中消失,但这并没有太大的风险。更大的问题是“例外”这个词:这意味着您必须证明您使用该权利的合理性,否则 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,例如,~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist这可能是您想要的。请参阅权利密钥参考文档中的文件访问临时扩展

另外,请注意,您已经可以“免费”访问 下的某些内容~/Library,因为它们被复制到您的容器中,或者在您使用适当的 API 而不是使用路径时间接访问。因此,可能有更好的方法来完成您正在做的事情——例如,读取您的应用程序以前的非沙盒版本留下的文件,您可能能够将它们迁移到容器中并在那里读取它们。

还有一件事:仅仅访问 ~/Library 并不会改变什么NSHomeDirectory(),URLsForDirectory:inDomains:等会返回——你仍然会得到~/Containers/com.mycompany.myproduct/Data/Library。Apple 的半官方建议处理这个问题是使用 BSD API 来获取用户的真实主目录,最简单的方法是:

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.
  • 这显然也可以用来获取其他用户的主Library目录(因此也是 ),但 App Store 几乎肯定不会允许任何实际尝试这样做的软件。
  • 图书馆所在的事实~/Library被认为是一个“实施细节”,可能有一天会改变,这是另一个原因(除了权利之外),这必须被视为一种临时解决方法,直到 Apple 为您的更高级别提供真正的解决方案 -水平问题,可能值得在您的评论笔记中提及。
于 2012-06-08T21:01:54.153 回答