lokale UIDocument in iCloud schieben - Cocoa error 4.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • lokale UIDocument in iCloud schieben - Cocoa error 4.

    Hallo Zusammen,

    ich komme nun wirklich nicht mehr weiter. Ich habe mich mit der neusten App an das Thema iCloud gewagt. Der Nutzer kann Daten unter anderem zunächst lokal anlegen. Er kann sich später entscheiden iCloud zu nutzen und die Daten sollen anschließend hochgeladen werden. Da geht etwas richtig schief (etwas gekürzt und auf den relevanten Teil beschränkt):

    Quellcode

    1. for (int i=0; i < localDocuments.count; i++) {
    2. NSURL * fileURL = [localDocuments objectAtIndex:i];
    3. NSLog(@"localToiCloudImpl: try to upload %@", [fileURL lastPathComponent]);
    4. if ([[fileURL pathExtension] isEqualToString:kExtension]) {
    5. NSString * fileName = [[fileURL lastPathComponent] stringByDeletingPathExtension];
    6. NSURL *destURL = [self getContactURLForName:fileName];
    7. // Perform actual move in background thread
    8. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    9. NSError * error;
    10. BOOL success = [[NSFileManager defaultManager] setUbiquitous:self.iCloudOn itemAtURL:fileURL destinationURL:destURL error:&error];
    11. if (success) {
    12. NSLog(@"Moved %@ to %@", fileURL, destURL);
    13. [self loadDocAtURL:destURL];
    14. } else {
    15. NSLog(@"Failed to move %@ to %@: %@", fileURL, destURL, error.localizedDescription);
    16. }
    17. });
    18. }
    19. }
    Alles anzeigen


    Ich erhalten keinen success.
    Failed to move file:///private/var/[...]/Test.gft/ to file:///private/var/mobile/Library/Mobile%20Documents/[...]/Documents/Test.gft: The operation couldn’t be completed. (Cocoa error 4.)

    Das UIDocument ist ein NSFileWrapper. Darin enthalten einmal das eigentliche Datenobjekt und des Weiteren ein MetaDaten Objekt.

    Richtig doof ist halt, dass ich nicht richtig getestet habe (oder es mal ging) und die App schon veröffentlicht ist. :thumbdown:
    Das fühlt sich echt doof an, etwas kaputtes im Store anzubieten. Jeder der mal einen Blick auf die App werfen möchte: itunes.apple.com/de/app/gifts-planner/id959389183?mt=8

    Ich freue mich riesig über jeden Tipp, der mir sagt woran das liegen könnte.
  • Ganz vergessen:

    Wenn der Nutzer direkt mit iCloud startet geht's auch nicht.
    Hier die Save Methode.

    Quellcode

    1. ContactDocument *newContactDoc = [[ContactDocument alloc] initWithFileURL:fileURL];
    2. [newContactDoc setNewContact:newContact];
    3. if (self.contactImage != nil) {
    4. [newContactDoc updateContactImage:[UIImage imageWithData:self.contactImage]];
    5. NSLog(@"new Contact with Image < < < <");
    6. NSLog(@"contact image = %@", newContactDoc.contact.image);
    7. }
    8. [newContactDoc saveToURL:newContactDoc.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
    9. if (!success) {
    10. NSLog(@"ERROR: Failed to save %@", [newContactDoc.fileURL lastPathComponent]);
    11. }
    12. [newContactDoc logDocumentState];
    13. if (success) {
    14. [...]
    15. }
    16. }];
    Alles anzeigen


    Ich erhalte
    2015-02-11 21:28:54.520 gifts[3452:60b] ERROR: Failed to save Test.gft
    2015-02-11 21:28:54.526 gifts[3452:60b] UIDocumentState: Closed, Saving error

    Der selbe Code funktioniert für lokale Dokumente hingegen tadellos. Hängen beide Probleme zusammen?
  • Okay, Cocoa error 4 bedeutet anscheinend, dass das Verzeichnis nicht vorhanden ist. Ich wollte meine Dokumente innerhalb des iCloud Containers im Documents Ordner anlegen.

    Quellcode

    1. NSURL *docsDir = [self.iCloudRoot URLByAppendingPathComponent:@"Documents" isDirectory:YES]; // Cocoa Error 4


    Ich konnte Dokumente auch direkt im iCloud Root ablegen. Dann wurden sie aber nicht mehr durch die Metadataquery im NSMetadataQueryUbiquitousDocumentsScope gefunden. Die Lösung war nun das Verzeichnis einfach selbst zu erstellen.
  • https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/index.html#//apple_ref/doc/constant_group/NSError_Codes schrieb:


    NSFileNoSuchFileError = 4


    Interessant ist in dem Zusammenhang also, wie genau Du die Ziel URL zusammenbaust.
    Meine Erfahrung auf lokaler Ebene ist, dass mitunter einige Pfadangaben ziemlich dynamisch sind und man mit absoluten Pfadangaben keinen Blumentopf gewinnt.
    (Hat mich mal mit dem Caches Directory getrollt, weil ein Ordnername mitten drin irgend ein pro App Start generierter Hash war…)

    Ansonsten musst Du schon selbst dafür sorgen, dass Ordner, in die Du etwas packen willst, auch wirklich da sind.
    Beispielsweise indem Du Dir zunächst die Ordnerstruktur anzeigst oder direkt gegen die Existenz der URL prüfst.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P