8

我在理解新的 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 */
}];

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

它是否正确?

但如果是这样,委托的方法就像panel:validateURL:error:变得无用!

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

4

1 回答 1

9

After contacting Apple, I can confirm what Rob Keniger wrote: NSOpenSavePanelDelegate method's don't have access to the filesystem in sandboxed applications.

于 2011-07-29T09:43:50.680 回答