转载于测试项目
要在家中复制,在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 – 应用程序沙箱:文档范围的书签不能解析;没有返回任何错误所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)