长期运行的 CKAsset 上传错误

Posted

技术标签:

【中文标题】长期运行的 CKAsset 上传错误【英文标题】:CKAsset Upload error with Long Lived Operations 【发布时间】:2021-04-13 09:58:16 【问题描述】:

当用户重新连接到互联网后,当应用尝试在长期操作中上传 CKAsset 时,我收到错误消息。重新打开应用时,长期运行的操作会返回此错误。

CKErrorCode(_nsError: 可能无法保存记录 资产, 谁的文件URL file:///var/mobile/Containers/Data/Application/UUID/Documents/rawContent 无法访问">)

我可以访问该路径并且是公开的。是什么导致了这个错误?

【问题讨论】:

【参考方案1】:

当您重播/重新启动文件时,CKOperation 无法再访问您要上传的文件的 url,您可能会收到此错误。您可以通过在启动初始操作时将 url 存储为书签来解决此问题,如下所示:

 if let data = try? url.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil) 
     UserDefaults.standard.set(data, forKey: "url")
 

在设置并重新启动长期运行的操作之前,请像这样恢复书签:

var isStale = false
guard let data = UserDefaults.standard.data(forKey: "url"),
      let url = try? URL(resolvingBookmarkData: data, bookmarkDataIsStale: &isStale),
      url.startAccessingSecurityScopedResource() else 
    return

将此包含在重新启动操作的最终完成处理程序中:

url.stopAccessingSecurityScopedResource()

【讨论】:

恢复的长寿命操作仍有旧 URL 的资产,并表示无法访问。在这种情况下,是否应该取消它并使用从书签中恢复的新网址创建新网址? @EugeneBelyakov 是的,如果由于您没有存储书签而无法在回放中访问该 url,或者恢复书签失败,那么唯一的选择就是取消操作。

以上是关于长期运行的 CKAsset 上传错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 CloudKit 在用户之间共享 CKAsset?

无法将 CKAsset 类型的值分配给 UIImage 类型

服务器记录中的 CKAsset 不包含 fileURL,甚至无法检查 nil

播放通过 CloudKit 作为 CKAsset 下载的视频 - iOS

vscode常见错误汇总(长期更新)

NSData - 写入临时文件/目录