好奇 CKAsset 的 fileUrl 是否可以随时间变化?

Curious whether fileUrl of CKAsset can change with time?

我也在客户端和 CKAsset 的 fileUrl 上缓存 CKRecord。 fileUrl 可以不时更改吗?资产/数据本身没有变化。

资产的 fileURL 不会改变,但如果这是您从服务器下载的资产,则数据只能保证存在于该位置,直到调用操作的完成块。在那之后,可以随时清理资产的支持文件以释放磁盘 space.

从服务器下载资产后,如果您想保留它,您应该将备份文件移动或复制到应用程序容器中的另一个位置。

存档的 URL 是一个完整路径,但自从 iOS 8 左右以来,您的应用程序用来存储其文件的容器 URL 每次都会更改 应用启动。

所以归档的URL是错误的

这对我来说似乎是 CKAssets 存档方式中的错误,它们应该存档和取消存档相对于应用程序容器的部分路径。不是完整路径。

我想我会提交一个雷达。

编辑:这是一个解决方案:

extension CKAsset {
    var url: URL? {
        let path = fileURL.path
        if FileManager.default.fileExists(atPath: path) {
            return fileURL
        } else if let index = path.range(of: "/Library/Caches/") {

            // archived CKAssets store full-path URLs but since iOS 8 or so
            // the path of our container (home-dir) changes every time we are
            // started. So the full path is useless. Try to mangle it.

            let suffix = String(path.suffix(from: index.upperBound))
            let adjustedUrl = URL.caches/suffix
            if FileManager.default.fileExists(atPath: adjustedUrl.path) {
                return adjustedUrl
            }
        }
        return nil
    }
}

public extension URL {
    static var caches: URL {
        return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first ?? URL(fileURLWithPath: "")
    }
}