NSSavePanel和Sandbox

Dev*_*Dev 8 cocoa sandbox nssavepanel osx-lion

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

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

代码签名和应用程序沙盒指南一样:

每当在沙箱内运行的应用程序调用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 */
}];
Run Code Online (Sandbox Code Playgroud)

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

它是否正确?

但如果是这样,代表的方法panel:validateURL:error:就变得毫无用处!

你能帮助我更详细地解释一下应用程序之间的联系Powerbox吗?

Dev*_*Dev 9

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