objective-c – 应用程序沙箱:文档范围的书签不能解析;没有返回任何错误

objective-c – 应用程序沙箱:文档范围的书签不能解析;没有返回任何错误,第1张

概述我正在沙盒我的应用程序,并尝试允许导入/导出多个文件,使用XML文件来引用它们。为了让我的应用程序(或另一个沙盒应用)访问XML中列出的文件,我还包括一个序列化的安全范围的书签。我正在按照 this answer所述进行序列化,我的单元测试(不是沙盒)写入和读取XML数据而没有问题。当我的应用程序解析书签时,返回的NSURL是nil,NSError引用也是。既然我不相信应该是这样,为什么会这样呢? 我正在沙盒我的应用程序,并尝试允许导入/导出多个文件,使用XML文件来引用它们。为了让我的应用程序(或另一个沙盒应用)访问XML中列出的文件,我还包括一个序列化的安全范围的书签。我正在按照 this answer所述进行序列化,我的单元测试(不是沙盒)写入和读取XML数据而没有问题。当我的应用程序解析书签时,返回的NSURL是nil,NSError引用也是。既然我不相信应该是这样,为什么会这样呢?我可以通过提示用户使用NSOpenPanel选择一个文件/目录来解决这个问题,但是我仍然希望让书签能够正常工作。

转载于测试项目

要在家中复制,在Xcode中创建一个新的Cocoa应用程序,并使用以下Gist来处理项目中的文件:https://gist.github.com/2582589(用正确的下一个视图循环更新)

然后,按照Apple’s instructions对项目进行代码签名。您可以通过单击按钮顺序重现问题(我提交给Apple为rdar://11369377)。您选择磁盘上的任何文件(应用程序的容器外部),然后选择要导出的XML,然后导入相同的XML。

希望你们能帮我弄清楚我在做错什么要么我做错了,框架错误地保留在自己身上,要么我做错了,完全是坏的。我试着不要blame the framework,那是什么呢?还是有另一种可能性?

示例代码

将XML导出到docURL:

// After the user picks an XML (docURL) destination with NSSavePanel[targetURL startAccessingSecurityScopedResource];NSData *bookmark = [targetURL bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope                       includingResourceValuesForKeys:nil                                        relativeToURL:docURL                                                error:&error];[targetURL stopAccessingSecurityScopedResource];

从docURL导入XML:

// After the user selected the XML (docURL) from an NSOpenPanelNSURL *result = [NSURL URLByResolvingBookmarkData:bookmarkData                                          options:NSURLBookmarkResolutionWithSecurityScope                                    relativeToURL:docURL                              bookmarkDataIsstale:nil                                            error:&error];

我尝试用这个电话与[docURL ..AccessingSecurityScopedResource],这没有什么作用(如预期的,因为docURL已经在开放面板中被选中的范围内

此外,我在我的app.enTitlements文件中指定以下内容:

com.apple.security.files.user-selected.read-writecom.apple.security.files.bookmarks.app-scopecom.apple.security.files.bookmarks.collection-scope

如上所述,第二步(解析书签)完成,但是将错误和结果都设为零。当我一直在执行沙盒时,我所犯的大多数错误都导致NSError被返回,这有助于我解决错误。但现在没有错误,没有URL被解决。

其他故障排除步骤

>我尝试将XML文件放入我的应用程序的沙箱中,这没有什么不同,所以访问XML文件不是问题
>应用程序使用ARC,但单元测试也是如此成功。我尝试使用alloc / init,而不是autoreleased类方法(以防万一)
>我在创建书签后立即粘贴了URL解析代码,运行正常,生成了安全范围的URL
>我在最初创建的书签(序列化之前)做了一个po,然后在反序列化之后的书签上,他们匹配100%。序列化不是问题
>我用CFURLCreateByResolvingBookmarkData(..)替代了分辨率通话,没有变化。如果它是一个错误,它存在于Core Foundation API以及Cocoa层
>为bookmarkDataIsstale指定值不起作用
>如果我为选项指定了0,那么我会得到一个有效的NSURL,但是它没有安全范围,因此后续的读取文件的调用仍然失败

换句话说,反序列化的书签似乎是有效的。如果书签数据被破坏,我怀疑NSURL能够做任何事情
NSURL.h没有任何有用的意见来指出我做错了什么

有没有人在沙盒应用程序中使用安全范围的文档书签?如果是这样,你在做什么不同于我?

*** 作系统版本请求

有人可以访问Mountain lion Beta,验证我的示例项目是否显示相同(缺少)错误?如果这是在狮子座后修复的错误,那我就不用担心了。我还没有在开发人员计划中,所以没有访问权限。我不知道回答这个问题是否会违反NDA,但我希望不会。

解决方法 在您的Gist代码中,更改AppDelegate.m中的以下行(第61行):

[xmlTextfileData writetoURL:savePanel.URL atomically:YES];

[xmlTextfileData writetoURL:savePanel.URL atomically:NO];

你的代码然后工作。

原因可能是在调用[anURL bookmarkDataWithOptions]之前需要具有包含文档范围的书签的现有(但为空)的文件的原因相同:在创建NSData实例时,ScopedBookmarkAgent添加了一些一个标签,可能是一个扩展文件属性)到该文件。

如果您以原子方式将数据(即书签URL)写入该文件,实际上它们不是直接写入该文件,而是首先写入一个临时文件,如果写入 *** 作成功则重命名。似乎已经添加到包含书签的(空的但是现有的)文件中的标签在写入临时文件的过程中会丢失,然后将其重命名(从而可能删除原始的空文件) 。

顺便说一句:在将相应的URL传递到包含文档范围书签的xml文件之前,不必创建应用范围的书签。

另外:在10.7.4中已将com.apple.security.files.bookmarks.collection-scope重命名为com.apple.security.files.bookmarks.document-scope。

总结

以上是内存溢出为你收集整理的objective-c – 应用程序沙箱:文档范围的书签不能解析;没有返回任何错误全部内容,希望文章能够帮你解决objective-c – 应用程序沙箱:文档范围的书签不能解析;没有返回任何错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1035611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存