aba*_*ert 29

是的,但它需要"临时例外"权利."临时"意味着它可能会在操作系统的某个未来版本中消失,但这并不是一个风险.更大的问题是"异常"一词:这意味着您必须证明您使用权利是合理的,或者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>
Run Code Online (Sandbox Code Playgroud)

最后的额外内容/是沙盒知道您想要访问目录而不是文件的方式.如果你关闭它,你将可以访问所有文件~/Library,这是你要求的,但不能访问(递归)子目录中的文件~/Library,比如说~/Library/LaunchAgents/com.mycompany.myapp.myoldagent.12345678-ABCD-EF00-1234-567890ABCDEF.plist,这是你可能想要的.请参阅权利密钥参考文档中的文件访问临时扩展.

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

还有一两件事:只要有访问〜/ Library不改变什么NSHomeDirectory(),URLsForDirectory:inDomains:等等.将返回- you'll仍然得到~/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];
Run Code Online (Sandbox Code Playgroud)

几点说明:

  • getpwuid过于频繁地打电话通常不是一个好主意.最好的解决方案是尽早调用此代码,然后缓存生成的代码NSURL.
  • 这显然也可以用于获取其他用户的主页(以及其他Library目录),但App Store几乎肯定不会允许任何实际尝试的软件.
  • 库所在的事实~/Library被认为是一个"实施细节",可能会改变一天,这是另一个原因(在权利之上),这必须被视为临时解决方案,直到Apple为您的更高层提供真正的解决方案水平问题,在您的评论中可能值得一提.

  • 我认为你需要在路径的末尾添加一个斜杠,如`<string>/Library/</ string>`,因为http://developer.apple.com/library/ios/documentation/Miscellaneous/上的文档Reference/EntitlementKeyReference/Chapters/AppSandboxTemporaryExceptionEntitlements.html#// apple_ref/doc/uid/TP40011195-CH5-SW7否则你只能寻址文件而不是目录. (3认同)
  • 这对我有用:`getpwnam([NSUserName()UTF8String]) - > pw_dir` (2认同)