Enregistrer iOS 8 Documents à iCloud Drive
Je veux avoir mon app enregistrer les documents qu'il crée à iCloud Drive, mais je vais avoir du mal à suivre avec ce que Apple a écrite. Voici ce que j'ai à ce jour, mais je ne suis pas sûr où aller à partir d'ici.
UPDATE2
J'ai de la suite dans mon code pour enregistrer manuellement un document à iCloud Drive:
- (void)initializeiCloudAccessWithCompletion:(void (^)(BOOL available)) completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.ubiquityURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (self.ubiquityURL != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud available at: %@", self.ubiquityURL);
completion(TRUE);
});
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud not available");
completion(FALSE);
});
}
});
}
if (buttonIndex == 4) {
[self initializeiCloudAccessWithCompletion:^(BOOL available) {
_iCloudAvailable = available;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:selectedCountry];
NSURL* url = [NSURL fileURLWithPath: pdfPath];
[self.manager setUbiquitous:YES itemAtURL:url destinationURL:self.ubiquityURL error:nil];
}];
}
J'ai le droit a mis en place pour l'ID d'Application et dans Xcode. Je clique sur le bouton pour enregistrer dans iCloud Drive, et pas d'erreur pop-up, l'application ne plante pas, mais rien ne s'affiche sur mon Mac dans iCloud Drive. L'application est en cours d'exécution sur mon iPhone 6 Plus via Vol d'Essai lors de l'utilisation d'iOS 8.1.1.
Si je l'exécute sur Simulateur (je sais que cela ne fonctionne pas en raison d'iCloud Drive ne fonctionne pas avec le simulateur), je reçois le crash d'erreur: 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[3]'
setUbiquitous:itemAtURL:destinationURL:error:
renvoie un BOOLÉEN si l'opération a réussi ou pas. Quelle est la valeur de retour? Également fournir un pointeur vers un NSError
de l'objet pour la error
paramètre. Si la méthode ne retourne PAS, ce sera probablement vous donner plus de conseils.désolé, je n'ai jamais foiré beaucoup avec NSFileManager de sorte que certains de ce qui se passe sur ma tête.
OriginalL'auteur user717452 | 2014-11-20
Vous devez vous connecter pour publier un commentaire.
Eh bien, vous avez m'a intéressé dans cette affaire moi-même et comme un résultat, j'ai passé de façon de beaucoup de temps sur cette question, mais maintenant que j'ai eu à travailler, je espère que cela vous aide!
Pour voir ce qui se passe réellement dans l'arrière-plan, vous pouvez jeter un oeil à
~/Library/Mobile Documents/
, comme c'est le dossier où les fichiers par la suite. Un autre très cool utilitaire estbrctl
, pour surveiller ce qui se passe sur votre mac, une fois de stocker un fichier dans iCloud. Exécuterbrctl log --wait --shorten
à partir d'une fenêtre de Terminal pour démarrer le journal.Première chose à faire, après l'activation de l'iCloud capacité (avec iCloud documents sélectionnés), est de fournir des informations pour iCloud Drive Support (L'activation iCloud Drive Support). Il fallait aussi que je bosse mon bundle version avant d'exécuter à nouveau l'application; m'a fallu un certain temps pour comprendre cela. Ajoutez les lignes suivantes à votre
info.plist
:Ensuite, le code:
J'ai un fichier appelé
demo.pdf
stockés dans le dossier Documents, que je vais être 'téléchargement'.Je vais mettre en évidence certaines parties:
URLForUbiquityContainerIdentifier:
fournit la racine du répertoire pour stocker les fichiers, si vous voulez qu'ils se présentent dans de iCloud Drive sur votre Mac, alors vous devez les stocker dans le dossier Documents, donc, ici, nous avons ajouter ce dossier à la racine:Vous devez également ajouter le nom de fichier de l'URL, ici, je copie le fichier dans le localURL (qui est une démo.pdf):
Et c'est principalement ça...
Comme un bonus, découvrez comment vous pouvez fournir une
NSError
pointeur pour obtenir le potentiel d'erreur de l'information:brutal log
sur mon Mac, mais je ne vois pas le dossier sur iCloud.com ou sur mon Mac. Toutes les pensées pourquoi cela pourrait être le cas?EDIT: A pour incrémenter
CFBundleVersion
. Affolant! stackoverflow.com/a/25328864/1148702Je sais, la folie.. je vais mettre en évidence que peu qu'il ma réponse un peu plus, vous semblez avoir oublié 🙂
Merci, dommage que j'ai raté ça (trouvé dans une autre réponse). Une autre chose que je pense faire cette réponse mieux: ne pas compter sur le hasard
demo.pdf
être dans le localDocuments
répertoire. J'ai ajouté un peu de code à écrire un petit fichier texte localDocuments
répertoire, et qui fait de cet échantillon plus autonome. Merci encore!Comment récupérer un fichier à partir de l'iCloud Drive?
OriginalL'auteur fguchelaar
Si vous avez l'intention de travailler avec UIDocument et iCloud, ce guide d'Apple est assez bonne:
https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/Introduction/Introduction.html
ÉDITÉ:
Ne connais pas de meilleur guide de la main, si cela peut aider:
Vous aurez besoin de récupérer les ubiquityURL à l'aide de la
URLForUbuiquityContainerIdentifier
fonctionNSFileManager
(ce qui devrait être fait de manière asynchrone).Une fois que c'est fait, vous pouvez utiliser le code suivant pour créer votre document.
Vous aurez également besoin de regarder dans l'aide de
NSMetadataQuery
pour détecter les documents téléchargés à partir d'autres appareils et potentiellement mettre en file d'attente pour le téléchargement, et en observant laNSPersistentStoreDidImportUbiquitousContentChangesNotification
à trouver sur les changements effectués via iCloud, entre autres choses.** Edit 2 **
Semble que vous essayez d'enregistrer un fichier PDF, ce qui n'est pas tout à fait ce qu'Apple considère qu'un "document" dans les termes de la synchronisation iCloud. Pas besoin d'utiliser UIManagedDocument. Retirez les 3 dernières lignes de votre gestionnaire d'achèvement et, au lieu de simplement utiliser NSFileManager de l'
setUbiquitous:itemAtURL:destinationURL:error:
fonction. La première URL doit être un chemin d'accès local à la PDF. La deuxième URL doit être le chemin à l'intérieur de la ubiquiuty conteneur enregistrer sous.Vous pouvez aussi avoir besoin de regarder dans NSFileCoordinator peut-être.
Je pense que ce guide d'Apple peut être les plus pertinents:
https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/iCloud/iCloud.html
Vérifier la mise à jour à ma question initiale, s'il vous plaît, pour voir si je suis gâcher quelque chose.
Je l'ai maintenant enregistrer les Métadonnées.fichier plist à iCloud Drive, mais pas le fichier PDF lui-même. Ce qui est foiré?
Pouvez-vous svp m'aider?
Donc, quelque chose comme la façon dont j'ai édité question d'origine?
OriginalL'auteur zeroimpl