在 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)的主要内容,如果未能解决你的问题,请参考以下文章
为 iOS 应用程序的文件启用 iCloud Drive 文件夹
在 iOS 8 中将应用程序的无处不在的容器暴露给 iCloud Drive