web-dev-qa-db-fra.com

Swift écrire / enregistrer / déplacer un fichier de document sur le lecteur iCloud

J'essaie depuis plus de deux jours d'écrire un fichier sur le lecteur iCloud. J'ai essayé d'écrire directement un fichier texte simple, localement puis de le déplacer, à l'aide de UIDocumentMenuViewController, etc. au moins le répertoire iCloud, il n'y a rien là-bas. J'ai essayé à la fois le simulateur et mon iPhone, déclenchant la synchronisation iCloud et tout ce à quoi je peux penser.

Mon objectif principal est d'écrire simplement un fichier texte sur le lecteur iCloud, qui sera plus tard un fichier "nombres"

J'ai configuré mon fichier plist et mes droits:

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.com.paul.c.$(PRODUCT_NAME:rfc1034identifier)</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerName</key>
        <string>myCloudTest</string>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

J'ai également augmenté par version de bundle comme indiqué à: Enregistrer les documents iOS 8 sur iCloud Drive

J'ai essayé des dizaines de tutoriels sans succès. Mon dernier code est basé sur cet exemple: https://medium.com/ios-os-x-development/icloud-drive-documents-1a46b5706fe1

Voici mon code:

@IBAction func ExportFile(sender: AnyObject) {

    var error:NSError?

    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil)?.URLByAppendingPathComponent("myCloudTest")

    //is iCloud working?
    if  iCloudDocumentsURL != nil {

        //Create the Directory if it doesn't exist
        if (!NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: nil)) {
                //This gets skipped after initial run saying directory exists, but still don't see it on iCloud
                NSFileManager.defaultManager().createDirectoryAtURL(iCloudDocumentsURL!, withIntermediateDirectories: true, attributes: nil, error: nil)
        }
    } else {
        println("iCloud is NOT working!")
        //  return
    }

    if ((error) != nil) {
        println("Error creating iCloud DIR")
    }


    //Set up directorys
    let localDocumentsURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: .UserDomainMask).last as! NSURL

    //Add txt file to my local folder
    let myTextString = NSString(string: "HELLO WORLD")
    let myLocalFile = localDocumentsURL.URLByAppendingPathComponent("myTextFile.txt")
    let written = myTextString.writeToURL(myLocalFile, atomically: true, encoding: NSUTF8StringEncoding, error: &error)

    if ((error) != nil){
        println("Error saving to local DIR")
    }


   //If file exists on iCloud remove it
    var isDir:ObjCBool = false
    if (NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: &isDir)) {
        NSFileManager.defaultManager().removeItemAtURL(iCloudDocumentsURL!, error: &error)
    }

    //copy from my local to iCloud
    if (error == nil && !NSFileManager.defaultManager().copyItemAtURL(localDocumentsURL, toURL: iCloudDocumentsURL!, error: &error)) {
        println(error?.localizedDescription);
    }

Merci d'avoir pris le temps pour cela.

À la vôtre, Paul

J'ai exécuté du code sur mon iphone après le code ci-dessus:

var error:NSError?
    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil) //?.URLByAppendingPathComponent("myCloudTest")

    var fileManager: NSFileManager = NSFileManager()


    var fileList: NSArray = fileManager.contentsOfDirectoryAtURL(iCloudDocumentsURL!, includingPropertiesForKeys: nil, options: nil, error: &error)!
    var filesStr: NSMutableString = NSMutableString(string: "Files in iCloud folder \n")
    for s in fileList {

        println(s)
    }

et il affiche le chemin d'accès à mon fichier texte: file: ///private/var/mobile/Library/Mobile%20Documents/iCloud~com~paul~c~myApp/MyTextFile.txt

Mon fichier est là, je ne le vois tout simplement pas sur le lecteur iCloud.

12
Paul C

J'ai eu ce problème. J'ai suivi les conseils ici et j'ai trouvé que ma clé Info.plist N'était pas correcte. Une fois que je l'ai changé en iCloud.MY_BUNDLE_IDENTIFIER (C'est-à-dire copier la chaîne de la touche CFBundleIdentifier plus haut dans Info.plist), Tout a commencé à fonctionner.

La suppression du .com de votre clé peut résoudre votre problème.

3
Rick Andrews

FWIW:

J'ai également découvert que le nom du projet dans l'ID du bundle est important.

L'ID de mon ensemble de projets ressemblait à ceci: aaa-bbb-ccc-ddd

Je n'ai pas pu faire fonctionner l'iCloud.

Ensuite, je l'ai renommé en: aaa-bbb.ccc-ddd

Cela a commencé à fonctionner.

3
Mehmet

Je crois que j'ai trouvé un moyen de tout synchroniser sans avoir à "bump" constamment mon numéro de bundle. J'ai essayé cela plusieurs fois tout en apportant des modifications dans la zone "capacités" du stockage de valeurs-clés/Documents iCloud/CloudKit et cela semble fonctionner à chaque fois.

  1. Déconnectez-vous d'iCloud sur votre Mac
  2. Déconnectez-vous d'iCloud sur votre simulateur
  3. Reconnectez-vous à iCloud sur votre Mac
  4. Reconnectez-vous à iCloud sur votre simulateur
  5. Faire une construction propre à partir de XCode (Shift-Cmd-K)

Cela semble réinitialiser la synchronisation des structures de dossiers lorsque votre application écrit dans votre répertoire iCloud Documents - sans avoir à toucher votre numéro de bundle. Cela prend un peu plus de temps pour le faire, mais je suis un petit TOC et préfère un peu mon lancement initial de l'application pour commencer avec un 1!

0
pscarnegie