Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa Mac OS应用程序:如何解析别名并读取沙盒中的原始文件_Cocoa_Appstore Sandbox - Fatal编程技术网

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

Cocoa Mac OS应用程序:如何解析别名并读取沙盒中的原始文件,cocoa,appstore-sandbox,Cocoa,Appstore Sandbox,我的mac os应用程序通过用户交互(拖放)获得别名的NSURL,因此该应用程序有权读取别名文件,但无权读取应用程序沙盒(mac os X 10.7/8)中的原始文件 我通过以下方式解析别名: NSData* bookmark = [NSURL bookmarkDataWithContentsOfURL:aliasURL error:nil]; origURL = [NSURL URLByResolvingBookmarkData:bookmark

我的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];
当我尝试读取Origur文件时,出现错误:
无法打开该文件,因为您没有查看该文件的权限

我还尝试调用原始图形上的
start/stopAccessingSecurityScopedResource
,但没有任何帮助

我还尝试使用
nsurlbookmarksolutionwithsecurityscope
选项解析书签数据,但获取
“无法打开该文件,因为它的格式不正确。”
URLByResolvingBookmarkData方法出错


那么,怎么做呢?谢谢。

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

在您的授权文件中,您是否确实将授权“com.apple.security.files.bookmarks.app scope”设置为“yes”

“无法打开该文件,因为它的格式不正确。”在尝试解析书签时,我遇到了相同的错误,这是因为该文件在Finder中被锁定(对该文件执行“获取信息”并选中“锁定”框已关闭),因此从一开始就从未生成安全数据

希望有什么东西可以帮上忙


托德。

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

您的应用程序可能可以访问别名文件,但只能访问该文件,而不能访问它所引用的文件。沙箱穿孔机制可能不遵循别名并授予对底层文件的访问权。如果您可以获取别名指向的文件路径(我不确定这是否可行),您可以通过提示用户在
NSOpenPanel
中选择该文件来绕过沙箱。这是另一种冲破沙箱的方式,使用苹果公司称之为“电源箱”


有关如何执行此操作的更多信息,请查看我在此处写的答案:。它链接到另一个答案,然后添加一些有用的细节,让用户更清楚地了解正在发生的事情。

谢谢,但我已将“com.apple.security.files.bookmarks.app scope”设置为“是”,并且文件的锁定框始终处于关闭状态。原始的
NSURL
是否首先使用安全范围创建?如果您有生成原始别名URL的代码,那么查看它会很有帮助。URL来自哪个应用程序?别名文件由Finder创建。我从NSPasteboard(NSDragginInfo)获取别名文件的URL,
aliasURL=[NSURL URLFromPasteboard:pb]
自OS X 10.10以来,有一个新的
+URLbyResolvingaliasFileAttribute:options:错误:
。但是,它声明不支持
nsurlbookmarksolutionwithsecurityscope
选项。因此,仍然无法通过别名进行访问。值得注意的是,在
NSOpenPanel
中选择别名也可以,因为会返回别名指向的目标路径。