我在沙箱我的应用程序,并试图允许多个文件导入/导出,使用XML文件来指代他们。 为了让我的应用程序(或其他沙盒应用程序)能够访问在XML中列出的文件,我还包括一个序列化的安全范围的书签我。 我其序列中描述的这个答案 ,我的单元测试( 未沙盒)写入和没有问题读取XML数据。 当我的应用程序解决了书签, NSURL
返回为零,因为是NSError
参考。 因为我不认为应该是这样的,为什么会发生? 我可以解决它通过提示用户选择与一个文件/目录NSOpenPanel
,但我还是想拿到书签,因为他们应该工作。
转载于一个测试项目
要重现在家,在Xcode中创建一个新的Cocoa程序,并使用以下要点在项目中的文件: https://gist.github.com/2582589 ( 用适当的下一个视循环更新 )
然后,按照苹果公司的指示 ,以代码签名的项目。 您重现该问题(这是我提交给苹果公司为:// 11369377 rdar通过点击序列按钮)。 你选择在磁盘上的任何文件(该应用程序的容器外),那么XML导出到,然后将相同的XML导入。
希望你们将能够帮我找出我在做什么错。 无论我做错了什么和框架被错误地保持自身,或者说我这样做是正确和它完全打破。 我尽量不怪的框架 ,所以这是什么呢? 还是有另一种可能性?
示例代码
导出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];
从导入XML docURL
:
// After the user selected the XML (docURL) from an NSOpenPanel
NSURL *result = [NSURL URLByResolvingBookmarkData:bookmarkData
options:NSURLBookmarkResolutionWithSecurityScope
relativeToURL:docURL
bookmarkDataIsStale:nil
error:&error];
我试图周围与该呼叫[docURL ..AccessingSecurityScopedResource]
这并没有使之差(如预期,由于docURL是已经具有打开面板在被选择之后范围内
另外,我指明在我下面app.entitlements
文件:
com.apple.security.files.user-selected.read-write
com.apple.security.files.bookmarks.app-scope
com.apple.security.files.bookmarks.collection-scope
如上所述,在第二步骤(解决书签)完成,但留下两个error
和result
为零。 正如我已经实现沙盒,最让我犯过的错误已经导致了NSError
返回,这帮助我解决的bug。 但是现在有没有错误,也没有URL得到解决。
其他故障排除步骤
我试图把XML文件到我的应用程序的沙盒,它没有做出区别,所以访问XML文件是没有问题的
该应用程序使用ARC,但这样做单元测试,取得成功。 我试图使用一个分配/代替初始化所述自动释放类方法的,太(以防万一)
我粘贴URL解析代码创建书签后,它运行良好,生产安全范围的URL
我做了
po
在最初创建书签(串行化之前),然后在反序列化后的书签,它们匹配100%。 序列化是没有问题的我取代了解析调用与
CFURLCreateByResolvingBookmarkData(..)
没有变化。 如果这是一个错误,这是目前的核心基础API以及可可层指定的值
bookmarkDataIsStale:
没有影响如果我指定
0
的options:
,然后我得到一个有效的NSURL,但它没有安全范围,因此后续调用来读取文件仍旧失败换句话说,反序列化书签确实出现了有效的。 如果书签数据被损坏,我怀疑NSURL将能够用它做任何事
NSURL.h
不包含任何有用的评论指出的东西,我做错了
使用安全范围的文档书签与成功的一个沙箱应用别人? 如果是这样,你在做什么不同于我是谁?
OS版本请求
有人访问山狮测试可以验证我的样本项目是否显示了相同的(缺乏)的错误? 如果是已经固定的狮子后的错误,我不会担心。 我不是开发商计划还没有,所以用不上。 我不知道如果回答这个问题将违反NDA,但我希望不会。