NSSavePanel和Sandbox

时间:2011-07-27 12:35:57

标签: cocoa sandbox osx-lion nssavepanel

我在理解新的Lion's Sandbox时遇到了一些问题。

我知道Lion包含一个名为Powerbox的受信任守护程序进程,其作用是代表沙盒应用程序显示和控制打开/保存对话框。

就像Code Signing And Application Sandboxing Guide说的那样:

  

任何时候在沙盒中运行的应用程序都会调用NSOpenPanel或NSSavePanel对话框,而不是直接显示面板,AppKit会自动要求Powerbox显示对话框。从开发人员的角度来看,在如何使用这些面板方面不需要更改代码;这个过程是完全透明的。

     

用户选择一组文件或目录后,Powerbox将使用沙箱内核模块中的新功能来扩展调用应用程序的沙箱,以允许访问所选文件。当应用程序代码向面板查询返回的URL或文件名时,它已经拥有访问这些文件的权限,并且可以通过它已经使用的几乎任何API继续使用这些文件。

确定。我使用这段代码做了一些实际测试:

NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.delegate = self;

savePanel.directoryURL = ...;
savePanel.nameFieldStringValue = ...;

[savePanel beginSheetModalForWindow:self.window
                  completionHandler:^(NSInteger returnCode) {
/* the completion handler */
}];

奇怪的是,在完成处理程序之前调用的NSOpenSavePanelDelegate方法无法访问文件系统上的文件

这是对的吗?

但如果是这样,代理人的方法如panel:validateURL:error:就变得无用了!

您能否帮助我更详细地解释应用与Powerbox之间的关系?

1 个答案:

答案 0 :(得分:9)

在联系Apple之后,我可以确认Rob Keniger所写的内容:NSOpenSavePanelDelegate方法无法访问沙盒应用程序中的文件系统。