NSSavePanel和沙盒机制

8
我有一些困惑,不太理解新版Lion的沙盒机制。
我知道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之间的连接吗?

1
为什么您的validateURL:方法需要访问文件系统?有关文件的URL已传递给委托方法,您还需要什么? - Rob Keniger
1
我想分析指定的URL是否可写,如果不行,则返回“NO”。 - Dev
无论如何,您可以确认一下NSOpenSavePanelDelegate的方法没有访问文件系统的权限吗?只有完成处理程序才能访问所选文件?(在我看来,官方文档缺乏说明。) - Dev
2
我可以确认,在 panel:validateURL:error: 委托方法中,您无法访问文件系统。如果您想更改此功能,请向苹果报告错误。 - Rob Keniger
1个回答

9

联系了苹果后,我可以确认Rob Keniger所写的:NSOpenSavePanelDelegate方法在沙盒应用程序中没有访问文件系统的权限。


你好,我已经开了一个技术支持事件(TSI) - Dev
啊,我懂了。上次我用它时,它们的回应是如此的无用,以至于我之后从未再使用过它。谢谢!顺便问一下,你知道在故事板中是否有任何办法在沙盒应用程序中使用[NSSavePanel savePanel]吗?没有办法让它工作。 - Duck
@Dev 你收到有用的TSI回复了吗?我们 - 我想其他人也是 - 都有同样的问题。 - Sebastian
@Dev,你能分享一下TSI的结果吗?那太棒了! - Tobi
哦,那是7年前的事了,不幸的是我手头没有更多的资料了 :) - Dev
我已经提交了一个Radar,但并不是很有希望:https://openradar.appspot.com/radar?id=5004220688236544 - Sindre Sorhus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接