我将文件存储在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
答案 0 :(得分:5)
很难相信其他人没有这个问题。同样,这是为了简单的文件存储和检索,而不是在设备之间动态同步。
问题的关键是iCloud不会自动将云文件同步到新设备。你的代码必须这样做。因此,如果您从设备中删除应用程序(但不是从iCloud中删除)并重新安装相同的应用程序,该应用程序将无法看到之前的iCloud文件。您可以添加新的代码并使用上面的代码查看它们,但您实际上只是看到了本地无处不在的容器副本。要查看以前需要在iCloud上执行metadataQuery的项目,请从metadataQuery结果中解析感兴趣的文件的文件名,然后运行 每个文件的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