Mac OS应用程序:如何解析别名并在沙箱中读取原始文件

时间:2012-10-12 00:55:05

标签: cocoa appstore-sandbox

我的mac os应用程序通过用户交互获取NSURL别名(拖放),因此应用程序具有读取别名文件的权限,但它没有权限读取应用程序沙箱中的origianl文件( Mac OS X 10.7 / 8)。

我通过

解析别名
NSData* bookmark = [NSURL bookmarkDataWithContentsOfURL:aliasURL error:nil];
origURL = [NSURL URLByResolvingBookmarkData:bookmark
                                    options:NSURLBookmarkResolutionWithoutUI
                              relativeToURL:nil
                        bookmarkDataIsStale:nil
                                      error:&error];

当我尝试读取origURL文件时,出现错误:The file couldn’t be opened because you don’t have permission to view it

我也尝试在origURL上调用start/stopAccessingSecurityScopedResource但没有帮助。

我还尝试使用NSURLBookmarkResolutionWithSecurityScope选项解析书签数据,但是从URLByResolvingBookmarkData方法中获取"The file couldn’t be opened because it isn’t in the correct format."错误。

那么,怎么做?感谢。

2 个答案:

答案 0 :(得分:3)

我没试过这个,但我想我可能知道发生了什么。 OS X通过拖放方式穿过沙箱的方式是通过授予应用程序文件被删除以访问已删除的文件,直到应用程序退出。这可以使用粘贴板上的普通NSString文件路径,因此它不依赖于安全范围机制。

您的应用可能有权访问别名文件,但只能访问该文件,而不是其引用的文件。沙箱打孔机制可能不遵循别名并授予对底层文件的访问权限。如果您可以获取别名所指向的文件的路径(并且我不确定是否可能),则可以通过提示用户在NSOpenPanel中选择该文件来绕过沙盒。这是使用Apple称之为“Power Box”的另一种穿越沙箱的方式。

有关如何执行此操作的详细信息,请查看我在此处写的答案:https://stackoverflow.com/a/11786156/105717。它链接到另一个答案,然后添加一些有用的细节,使用户更清楚地了解情况。

答案 1 :(得分:0)

也许,也许我的类似情况和解决方案会有所帮助:

您是否确实在权利文件中将权限“com.apple.security.files.bookmarks.app-scope”设置为“是”?

“无法打开文件,因为格式不正确。”我在尝试解析书签时遇到同样的错误,结果证明该文件已在Finder中锁定(在文件上执行'获取信息'并检查'锁定'框是否已关闭)因此安全性数据从未生成过。

希望有帮助的东西!

托德。