在 iOS 上保存 iCloud Drive 安全范围 URL (UIDocumentPickerViewController)

Posted

技术标签:

【中文标题】在 iOS 上保存 iCloud Drive 安全范围 URL (UIDocumentPickerViewController)【英文标题】:Saving an iCloud Drive security scoped URL on iOS (UIDocumentPickerViewController) 【发布时间】:2014-11-19 18:25:19 【问题描述】:

我正在尝试保存从 iCloud 文档选择器 (UIDocumentPickerViewController) 返回的安全范围 URL

文档说明:

如果 URL 不是通用 URL,则使用 这 bookmarkDataWithOptions:包括ResourceValuesForKeys:relativeToURL:错误: 方法并传入 NSURLBookmarkCreationWithSecurityScope 选项。调用此方法会创建一个书签,其中包含 安全范围的 URL,您可以使用它来打开文件而无需进一步 用户干预。

但是,编译器说 NSURLBookmarkCreationWithSecurityScope 在 ios 上不受支持。

有谁知道这里发生了什么......?

【问题讨论】:

我遇到了同样的问题。只是想知道您是否找到了问题的解决方案? 仍在与 Apple DTS 进行“谈判” :-( 在文档中这是链接:developer.apple.com/library/prerelease/ios/documentation/… 清楚地表明这是为安全范围 URL 保存书签所需的操作。这很令人困惑。 【参考方案1】:

经过进一步挖掘,发现在 IOS 中创建书签数据时根本不需要选项 NSURLBookmarkCreationWithSecurityScope。这是 OS X 的一个选项。您可以将 nil 传递给选项字段。我认为 Apple 的文档充其量是令人困惑的。 但是,您确实需要在创建书签之前调用 startAccessingSecurityScopedResource 并确保调用返回 1(成功),然后再继续。否则,书签创建将失败。下面是示例代码:

 if ([url startAccessingSecurityScopedResource]==1)   
     NSError *error;  
     NSData *bookmark = [url bookmarkDataWithOptions:nil  
                      includingResourceValuesForKeys:nil  
                                       relativeToURL:nil  
                                               error:&error];  
     if (error) 
        //handle error condition  
      else 
        // save your bookmark  
     
   
 [url stopAccessingSecurityScopedResource];

再一次,Apple 的文档充其量是混乱的!我花了很多时间才发现这一点。希望这会有所帮助。

【讨论】:

【参考方案2】:

我今天遇到了同样的问题,编译器确实说NSURLBookmarkCreationWithSecurityScope 在 iOS 上不可用。

但令我惊讶的是,如果我改用原始常量(NSURLBookmarkCreationWithSecurityScope 映射到 ( 1 << 11 ),该方法似乎有效。它返回一个有效的书签数据对象,当我调用 [[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:stale] 时,一个有效的安全-scoped NSURL 返回,我可以访问文件和目录。另外,我使用 iCloud Drive 测试了这些。文档只说这应该适用于第三方文档提供商。

我不确定这种方法有多可靠,因为苹果工程师似乎没有时间完成这个功能,所以在最后一分钟禁用了它。或者它可能只是头文件中的一个错误。如果有人对此有更多了解,请发表评论。

【讨论】:

尝试使用第三方扩展:Box。不幸的是,对于原始常量,返回的书签数据为空。 Dropbox、Google Drive 等其他云服务商目前不支持打开模式,因此无法测试。 Box 的打开模式可能无法正常工作。至少不是文件包。我试图列出文件包内容,但一无所获。同样的方法适用于 iCloud Drive,所以看起来虽然 Box“支持”打开模式,但它不能正常工作。

以上是关于在 iOS 上保存 iCloud Drive 安全范围 URL (UIDocumentPickerViewController)的主要内容,如果未能解决你的问题,请参考以下文章

删除 iCloud Drive 文件时删除本地文件

为 iOS 应用程序的文件启用 iCloud Drive 文件夹

在 iOS 8 中将应用程序的无处不在的容器暴露给 iCloud Drive

iOS 的 8 iCloud Drive 是不是允许不同的用户共享文件?

从 iCloud Drive iOS 目标 C 下载图像

iOS 11 Files 应用程序 - Google Drive 大文件导入问题