重新安装应用后 iCloud 文件不可见 swift

iCloud files not visible after app reinstall swift

我将文件存储在 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

如有任何指导,我们将不胜感激。 Swift3,iOS10,Xcode8

很难相信没有其他人遇到过这个问题。同样,这是为了简单的文件存储和检索,而不是在设备之间动态同步。

问题的要点是 iCloud 不会自动将云文件同步到新设备。您的代码必须这样做。因此,如果您从设备(但不是从 iCloud)中删除一个应用程序并重新安装同一个应用程序,该应用程序将看不到以前的 iCloud 文件。您可以添加新的并使用上面的代码查看它们,但您实际上只是看到本地无处不在的容器副本。要查看以前的项目,您需要在 iCloud 上执行元数据查询,从元数据查询结果中解析感兴趣文件的文件名,然后 运行 每个文件上的 startDownloadingUbiquitousItem(at:)。例如,根据 metadataQuery 结果在 iCloud 中创建一个文件数组,并将此 do-catch 放入 for-in 循环中。

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