Ich erstelle eine App, die ihre Dateien im Ordner iCloud Drive des Benutzers speichert. Alles hat gut funktioniert, bis ich den App-Ordner in iCloud Drive gelöscht habe, um zu sehen, was passieren würde. Seitdem versuche ich jedes Mal, wenn ich die App öffne, meine Beispieldatei in iCloud zu speichern, aber es funktioniert nicht (die Funktion reloadiCloud() wird in ViewWillAppear ausgeführt). Was muss ich noch tun, um den iCloud Drive-Ordner zu erstellen? Mein Code ist unten.App erstellt iCloud Drive-Ordner nicht neu
func reloadiCloud() {
ubiquityURL = filemgr.url(forUbiquityContainerIdentifier: nil)
guard ubiquityURL != nil else {
print("Unable to access iCloud Account")
return
}
ubiquityURL = ubiquityURL?.appendingPathComponent("Documents")
metaDataQuery = NSMetadataQuery()
metaDataQuery?.predicate = NSPredicate(format: "NOT %K.pathExtension = ''", NSMetadataItemFSNameKey)
metaDataQuery?.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.metadataQueryDidFinishGathering), name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: metaDataQuery!)
metaDataQuery!.start()
}
func metadataQueryDidFinishGathering(notification: NSNotification) -> Void {
let query: NSMetadataQuery = notification.object as! NSMetadataQuery
query.disableUpdates()
NotificationCenter.default.removeObserver(self, name: NSNotification.Name.NSMetadataQueryDidFinishGathering, object: query)
query.stop()
if query.resultCount > 0 {
fileList = []
for var i in (0..<query.resultCount) {
let currentFileURL = query.value(ofAttribute: NSMetadataItemURLKey, forResultAt: i) as! URL
fileList.append(currentFileURL.lastPathComponent)
tableView.reloadData()
}
tableView.reloadData()
print(fileList)
} else {
let sampleFile = Bundle.main.url(forResource: "Sample", withExtension: "pdf")!
movetoiCloud(forURL: sampleFile)
}
}
func movetoiCloud(forURL: URL) {
let fileName = forURL.lastPathComponent
ubiquityURL = filemgr.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents/\(fileName)")
//Check if the filename exists and add "copy" to the new version
for var i in (0..<fileList.count) {
if fileList[i] == forURL.lastPathComponent {
let base = ubiquityURL?.absoluteURL.deletingLastPathComponent()
let endIndex = fileName.index(fileName.endIndex, offsetBy: -4)
let truncatedExtension = fileName.substring(from: endIndex)
let truncatedName = fileName.substring(to: endIndex).appending(" copy").appending(truncatedExtension)
ubiquityURL = base?.appendingPathComponent(truncatedName)
print("New ubiquity URL: \(ubiquityURL)")
}
}
do {
try filemgr.setUbiquitous(true, itemAt: forURL, destinationURL: (ubiquityURL)!)
reloadiCloud()
print("Move to iCloud OK")
} catch let error {
print("moveToiCloud failed: \(error.localizedDescription)")
}
}
Bumping die Bundle-Version funktionierte sofort für mich. Vielen Dank! – damote
Glücklich zu helfen! @ Damote –
OMG, ich suchte dies für 2 Tage. Aber wenn der Benutzer den Ordner später aus dem Laufwerk löscht, wird er den Ordner neu erstellen oder nicht? – ChanWarde