重新安装应用后iCloud文件不可见(Swift)。

4

我将文件存储在iCloud中作为一种备份手段。上传和下载文件似乎很正常,但是如果我在设备上删除应用程序并重新安装同一设备上的应用程序,则再也看不到已上传到iCloud的文件(即使是在删除应用程序之前刚刚从该设备上传的文件)。ubiquityIdentityToken在所有安装中都是相同的。我不是要在设备之间进行同步,只是要存储和检索。我可以在\settings\icloud\manage storage\中看到这些文件,但无法通过运行此代码查看:

func createListOfSQLBaseFilesIniCloudDocumentsDirectory() -> [String]{

    let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents")

    var iCloudBackupSQLFiles = [String]()

    do{
        let directoryContents = try FileManager.default.contentsOfDirectory(at: iCloudDocumentsURL!, includingPropertiesForKeys: nil, options: [])

        for myFile in directoryContents {
            if myFile.pathExtension == "sqlite" {

                let fileWithExtension = myFile.lastPathComponent
                //backupSQLFiles is an array of full file names - including the extension
                iCloudBackupSQLFiles.append(fileWithExtension)

            }//if myFile
        }//for in

    } catch let error as NSError {
        print("Unresolved error \(error), \(error.userInfo)")
    }//do catch

    return iCloudBackupSQLFiles

}//createListOfSQLBaseFilesIniCloudDocumentsDirectory

任何指导都将不胜感激。Swift 3,iOS 10,Xcode 8。
1个回答

17

很难相信没有其他人遇到过这个问题。再次强调,这只适用于简单的文件存储和检索,而不是在设备之间动态同步。

问题的要点在于iCloud不会自动将云文件同步到新设备上。必须通过编码来完成此操作。因此,如果您从设备中删除应用程序(但没有从iCloud中删除),然后重新安装该应用程序,则该应用程序将无法查看以前的iCloud文件。您可以使用上面的代码添加新文件并查看它们,但实际上只是查看本地普遍容器的副本。要查看以前的项目,需要对iCloud执行metadataQuery,从metadataQuery结果中解析出感兴趣的文件的文件名,然后对每个文件运行startDownloadingUbiquitousItem(at:)。例如,从metadataQuery结果中创建一个iCloud文件数组,并在for-in循环中放置此do-catch。

let fileManager = FileManager.default
let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents", isDirectory: true)   
let iCloudDocumentToCheckURL = iCloudDocumentsURL?.appendingPathComponent(whateverFileName, isDirectory: false)

do {
    try fileManager.startDownloadingUbiquitousItem(at: iCloudDocumentToCheckURL!)
    print("tested file: \(whateverFileName)")

} catch let error as NSError {
    print("Unresolved error \(error), \(error.userInfo)")
}//do catch

1
使用这个功能为什么这么麻烦?文档也太少了吧。非常感谢你们的付出。 - Bruno Muniz
你是否知道如何处理NSMetadataQuery,以便能够意识到此下载的完成? - Bruno Muniz
试试这个链接:https://github.com/drewmccormack/SwiftCloudDrive/,这是一个更简单的解决方案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接