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.
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.
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.
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.
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!