应用程序沙箱:文件范围的加入书签的未解决; 不返回任何错误(App Sandbox: docum

2019-06-23 20:11发布

我在沙箱我的应用程序,并试图允许多个文件导入/导出,使用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

如上所述,在第二步骤(解决书签)完成,但留下两个errorresult为零。 正如我已经实现沙盒,最让我犯过的错误已经导致了NSError返回,这帮助我解决的bug。 但是现在有没有错误,也没有URL得到解决。

其他故障排除步骤

  • 我试图把XML文件到我的应用程序的沙盒,它没有做出区别,所以访问XML文件是没有问题的

  • 该应用程序使用ARC,但这样做单元测试,取得成功。 我试图使用一个分配/代替初始化所述自动释放类方法的,太(以防万一)

  • 我粘贴URL解析代码创建书签后,它运行良好,生产安全范围的URL

  • 我做了po在最初创建书签(串行化之前),然后在反序列化后的书签,它们匹配100%。 序列化是没有问题的

  • 我取代了解析调用与CFURLCreateByResolvingBookmarkData(..)没有变化。 如果这是一个错误,这是目前的核心基础API以及可可层

  • 指定的值bookmarkDataIsStale:没有影响

  • 如果我指定0options: ,然后得到一个有效的NSURL,但它没有安全范围,因此后续调用来读取文件仍旧失败

    换句话说,反序列化书签确实出现了有效的。 如果书签数据被损坏,我怀疑NSURL将能够用它做任何事

  • NSURL.h不包含任何有用的评论指出的东西,我做错了

使用安全范围的文档书签与成功的一个沙箱应用别人? 如果是这样,你在做什么不同于我是谁?

OS版本请求

有人访问山狮测试可以验证我的样本项目是否显示了相同的(缺乏)的错误? 如果是已经固定的狮子后的错误,我不会担心。 我不是开发商计划还没有,所以用不上。 我不知道如果回答这个问题将违反NDA,但我希望不会。

Answer 1:

在你的代码要点,改变AppDelegate.m(61行)的行:

[xmlTextFileData writeToURL:savePanel.URL atomically:YES];

[xmlTextFileData writeToURL:savePanel.URL atomically:NO];

然后,您的代码将工作。

这样做的原因可能是,这就是它必须有一个现有的(但是空的)文件,该文件将包含文件范围的书签调用[anURL bookmarkDataWithOptions]之前同样的原因:在创建NSData的情况下,ScopedBookmarkAgent增加了一些(如一个标签,可能是一个扩展的文件属性)到该文件。

如果你写数据(即书签的网址),该文件原子,其实他们写的不是直接到该文件,但首先,如果写操作成功,那被重命名的临时文件。 似乎已被添加到将包含书签标记(空的,但现有的)文件是越来越期间写入到一个临时文件,然后重命名它的这个过程中丢失(从而有可能删除原始的空文件) 。

顺便说一句:这不应该是必要通过相应的URL包含文档范围的书签XML文件之前创建的应用程序范围的书签。

另外:com.apple.security.files.bookmarks.collection-范围已更名为com.apple.security.files.bookmarks.document-范围,10.7.4。



文章来源: App Sandbox: document-scoped bookmark not resolving; not returning any error