我的 OS X 应用程序(当前未沙箱)访问用户设置的目录中包含的文件(选择带有NSOpenPanel
并且在整个执行过程中都会保留对该路径的引用)。文件列表是通过生成的NSDirectoryEnumerator
然后我使用读取和写入这些文件AVAsset
and taglib
(在带有桥接头的 C++ 中)分别。
正如预期的那样,在 Xcode 中启用沙盒会使应用程序变得无用,文件列表由NSDirectoryEnumerator
是空的,即使不是,我也无法读取和写入文件。我需要采取哪些步骤才能使我的应用程序符合沙箱要求?
我的应用程序需要基于文档吗?我的应用程序真的可以“基于文档”吗,因为我实际上没有适当的文档(例如:每个文件没有一个窗口,它似乎不符合标准的基于文档的应用程序模型)?我的应用程序基本上只是一个表视图,其中文件引用作为行。
另一个重要点:如果我的应用程序是基于文档的,我仍然可以使用 taglib 写入我的文件吗?我需要将 taglib 作为字符串指针传递到我的文件的路径才能使其工作。
非常感谢,这个话题目前很混乱。
您不必将应用程序转换为基于文档即可访问用户选择的文件和安全范围的书签。
我可以想到您当前的代码无法在沙盒环境中运行的两个原因:
- 您没有“用户选择的文件访问”功能集(Xcode > 目标 > 功能 > 应用程序沙箱 > 文件访问)
- 您正在使用基于路径/NSString 的目录枚举器 API,而不是基于 URL NSURL 的 API。
启用沙箱并设置用户选择文件功能的普通 Xcode 项目应枚举通过以下方式获得的任何路径NSOpenPanel
:
NSOpenPanel* panel =[NSOpenPanel openPanel];
panel.canChooseDirectories = YES;
[panel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) {
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *directoryURL = panel.URL;
NSDirectoryEnumerator *enumerator = [fileManager
enumeratorAtURL:directoryURL
includingPropertiesForKeys:nil
options:0
errorHandler:nil];
for (NSURL *url in enumerator) {
NSLog(@"url:%@", url);
}
}];
如果您希望存储在应用程序启动/退出周期中从沙箱访问特定文件夹的能力,则需要存储安全范围的书签。
这篇文章包含通过应用程序范围书签保留用户选择的文件/目录访问的信息:创建安全范围书签时遇到问题 https://stackoverflow.com/q/10043345/100848
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)