2017-02-14 1 views
0

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)") 
    } 
} 

Antwort

2

Versuchen Sie, die Bündelnummer und die Version in dem Info-plist aktualisiert, ist eine Erhöhung dieser Werte für die icloud Ergänzungen erforderlich wirksam werden.

+0

Bumping die Bundle-Version funktionierte sofort für mich. Vielen Dank! – damote

+0

Glücklich zu helfen! @ Damote –

+0

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

Verwandte Themen