沙盒应用程序中的NSOpenPanel会忽略提供的目录URL

Bor*_*isV 5 cocoa nsurl nsopenpanel appstore-sandbox osx-yosemite

我正在构建沙盒OS X应用程序(OS X 10.10.5,Xcode 6.4)。在执行过程中,我打开NSOpenPanel对象。然后运行下一个代码段:

NSString* s=[@"~" stringByExpandingTildeInPath]; 
NSOpenPanel* panel = [NSOpenPanel openPanel];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
NSURL* url=[NSURL fileURLWithPath:s];
if(url){
    [panel setDirectoryURL:url];
}
[panel setAllowsMultipleSelection:YES];
[panel beginSheetModalForWindow:[self.outlineView window]completionHandler:^(NSInteger result) {}
Run Code Online (Sandbox Code Playgroud)

我的期望是在目录/Users/xxx/Library/Containers/com.123456.App/中打开面板

相反,该面板在目录/ Users / xxx中打开

实际上已将应用程序构建并部署到目录/Users/xxx/Library/Containers/com.123456.App/Data/

在调试时,我注意到这一点:

if(url){
    [panel setDirectoryURL:url];
}
Run Code Online (Sandbox Code Playgroud)

网址包含正确的值:file:///Users/xxx/Library/Containers/com.123456.App/Data/

任何的想法?

Bre*_*nks 1

NSOpenPanel您想在应用程序的容器中使用 an 是否有原因?该容器用于存储应用程序的内部数据/支持文件(用户通常不需要访问)。NSOpenPanel/NSSavePanel用于用户从自己的文档中选择一个文件/目录,该文件/目录不会位于容器中。

另外,考虑使用NSFileManager URLsForDirectory:inDomains:NSURL 来获取所需路径。

  • @Boris - 您只需要使用“NSOpenPanel”让用户授予您访问您的应用程序尚未访问的文件的权限。容器中的文件可以直接访问,并且可以使用常用的 API 查找目录的内容。 (3认同)