2

我的 OS X 应用程序(当前未沙盒)访问包含在用户设置的目录中的文件(选择带有 a 的路径,NSOpenPanel并且在整个执行过程中都会保留对该路径的引用)。文件列表是通过生成的,NSDirectoryEnumerator然后我分别使用AVAssettaglib(在具有桥接头的 C++ 中)读取和写入这些文件。

正如预期的那样,在 Xcode 中启用沙盒会使应用程序无用,给出的文件列表NSDirectoryEnumerator是空的,即使不是,我也无法读取和写入文件。为了使我的应用程序符合沙盒标准,我需要采取哪些步骤?

我的应用程序需要基于文档吗?我的应用程序真的可以“基于文档”吗,因为我没有真正的文档(例如:我没有每个文件的窗口,它似乎不符合标准的基于文档的应用程序模型)?我的应用程序基本上只是一个表格视图,其中文件引用作为行。另一个重要的一点:如果我的应用程序是基于文档的,我还可以使用 taglib 写入我的文件吗?我需要将 taglib 的路径作为字符串指针传递给我的文件,以便它工作。

非常感谢,这个话题目前很混乱。

4

2 回答 2

3

您不必将您的应用程序转换为基于文档的应用程序即可访问用户选择的文件和安全范围的书签。

我可以想到您当前的代码在沙盒环境中不起作用的两个原因:

  • 您没有“用户选择的文件访问”功能集(Xcode > target > Capabilities > App Sandbox > File Access)
  • 您正在使用基于路径/NSString 的目录枚举器 API,而不是基于 URL NSURL 的 API。

启用沙盒和用户选择的文件功能集的 vanilla 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);
    }
}];

如果您想存储跨应用程序启动/退出周期从沙箱访问特定文件夹的能力,您将需要存储一个安全范围的书签。这篇文章包含通过应用程序范围的书签保留用户选择的文件/目录访问的信息: 创建安全范围的书签时遇到问题

于 2015-11-03T09:28:04.470 回答
1

听起来当前的功能将很好地转换为沙盒。

  1. 用户通过选择目录NSOpenPanel(这将调用沙盒环境中称为Powerbox的东西)。
  2. 这个目录现在是可写的,因为用户已经明确地选择了它。
  3. 您甚至可以通过创建安全范围书签并将其存储在会话之间来保持对该目录的写访问权。

这与基于文档毫无关系。那是与沙盒无关的内部设计。

于 2015-11-03T09:23:01.463 回答