【问题标题】:Mac OS App: How to resolve alias and read original file within sandboxMac OS App:如何在沙箱中解析别名并读取原始文件
【发布时间】:2012-10-12 00:55:04
【问题描述】:

我的 mac os 应用程序通过用户交互(拖放)获取别名的 NSURL,因此该应用程序有权读取别名文件,但它无权读取应用程序沙箱中的原始文件(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." 错误。

那么,怎么做呢?谢谢。

【问题讨论】:

  • 最初创建的NSURL 是否具有安全范围?如果您有生成原始别名 URL 的代码,那么查看它会很有帮助。 URL 来自哪些应用程序?
  • 别名文件由Finder创建。我从 NSPasteboard(NSDraggingInfo), aliasURL = [NSURL URLFromPasteboard:pb] 获得别名文件的 URL
  • 从 OS X 10.10 开始有一个新的+ URLByResolvingAliasFileAtURL:options:error:。然而,它声明NSURLBookmarkResolutionWithSecurityScope 选项受支持。所以,仍然无法通过别名访问。

标签: cocoa appstore-sandbox


【解决方案1】:

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

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

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

【讨论】:

  • 值得注意的是,在NSOpenPanel 中选择别名也可以,因为返回的目标路径是别名指向的路径。
【解决方案2】:

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

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

“无法打开文件,因为它的格式不正确。”我在尝试解决书签时遇到了同样的错误,原来是文件被锁定在 Finder 中(在文件上执行“获取信息”并选中“锁定”框已关闭)所以安全性数据从一开始就没有生成。

希望能帮上忙!

托德。

【讨论】:

  • 谢谢,但我已将“com.apple.security.files.bookmarks.app-scope”设置为YES,并且文件的锁定框始终处于关闭状态。
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2011-01-01
  • 2018-01-13
  • 2019-08-26
  • 1970-01-01
  • 2010-12-25
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多