我在理解新的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
之间的关系?
答案 0 :(得分:9)
在联系Apple之后,我可以确认Rob Keniger所写的内容:NSOpenSavePanelDelegate
方法无法访问沙盒应用程序中的文件系统。