我有一些困惑,不太理解新版Lion的沙盒机制。
我知道Lion包含一个受信任的守护进程,名为Powerbox,其工作是代表沙盒应用程序呈现和控制打开/保存对话框。
就像代码签名和应用沙盒指南所说:
“任何时候在沙盒内运行的应用程序调用NSOpenPanel或NSSavePanel对话框,AppKit会自动要求Powerbox呈现对话框。从开发人员的角度来看,在使用这些面板的方式方面不需要进行任何代码更改;此过程完全透明。”
用户选择文件或目录后,Powerbox使用沙盒内核模块中的新功能扩展调用应用程序的沙盒,以允许访问所选文件。当应用程序代码查询返回的URL或文件名时,它已经获得了访问这些文件的权限,并且可以通过几乎任何API继续使用这些文件。
好的,我用以下代码进行了一些实际测试:
奇怪的是,在完成处理程序之前调用的
这是正确的吗?
但如果是这样,那么像
你能帮我更详细地解释应用程序与
我知道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
之间的连接吗?
validateURL:
方法需要访问文件系统?有关文件的URL已传递给委托方法,您还需要什么? - Rob KenigerNSOpenSavePanelDelegate
的方法没有访问文件系统的权限吗?只有完成处理程序才能访问所选文件?(在我看来,官方文档缺乏说明。) - Devpanel:validateURL:error:
委托方法中,您无法访问文件系统。如果您想更改此功能,请向苹果报告错误。 - Rob Keniger