gpt4 book ai didi

macos - OS X 应用程序沙箱和任意文件访问 - 更新为基于文档?

转载 作者:行者123 更新时间:2023-12-03 16:30:50 25 4
gpt4 key购买 nike

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

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

我的应用程序需要基于文档吗?我的应用程序真的可以“基于文档”吗,因为我实际上没有适当的文档(例如:每个文件没有一个窗口,它似乎不符合标准的基于文档的应用程序模型)?我的应用程序基本上只是一个 TableView ,其中文件引用作为行。另一个重要的点:如果我的应用程序是基于文档的,我仍然可以使用 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);
}
}];

如果您想要存储在应用程序启动/退出周期中从沙箱访问特定文件夹的能力,您将需要存储安全范围的书签。这篇文章包含通过应用程序范围书签保留用户选择的文件/目录访问的信息: Trouble creating Security-Scoped Bookmark

关于macos - OS X 应用程序沙箱和任意文件访问 - 更新为基于文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com