2015-05-12 13 views
9

L'app per iPhone/iOS utilizza CoreData + SQLite (NSSQLiteStoreType) + iCloud iOS. Quando l'app si avvia alla prima installazione (o dopo l'eliminazione e la reinstallazione tramite xcode) e ci sono dati delle applicazioni precedenti in iCloud da un'installazione precedente o da altri dispositivi nello stesso account, si verifica il seguente errore, quindi un ritardo di 60 secondi, quindi una migrazione riuscita a iCloud. Il risultato è che l'utente dell'app pensa che i propri dati vengano persi quando l'app viene aggiornata. Tuttavia, dopo il ritardo di 60 secondi, i dati vengono ripristinati. Segue l'errore e qualche codice.Che cosa causa l'errore iOS iCloud: Errore Dominio = Codice BRCloudDocsErrorDomain = 12 "Impossibile completare l'operazione." Nuovo tentativo dopo un ritardo: 60

Che cosa causa questo errore? Dove posso saperne di più su questo errore?

[4972:2014294] CoreData: iCloud: Error: initial sync notification returned an error (Error Domain=BRCloudDocsErrorDomain Code=12 "The operation couldn't be completed. (BRCloudDocsErrorDomain error 12.)")

[4972:2014294] -PFUbiquitySetupAssistant finishSetupWithRetry:: CoreData: Ubiquity: : Retrying after delay: 60 Error Domain=BRCloudDocsErrorDomain Code=12 "The operation couldn't be completed. (BRCloudDocsErrorDomain error 12.)"

Ecco uno snippet di codice e un registro più dettagliato per fornire più contesto.

Dal delegato app:

 - (void)applicationDidFinishLaunching:(UIApplication *)application { 

      ... standard iCloud and app setup ... 

      NSManagedObjectContext *context = [self managedObjectContext]; 

      ... 

      ... query the db ... 
     } 

     /** 
     Returns the managed object context for the application. 
     If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
     */ 
     - (NSManagedObjectContext *) managedObjectContext { 

      if (managedObjectContext != nil) { 
       return managedObjectContext; 
      } 

      NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
      if (coordinator != nil) { 
       managedObjectContext = [[NSManagedObjectContext alloc] init]; 
       [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
      } 
      managedObjectContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy; 
      return managedObjectContext; 
     } 

     ... 

     /** 
     Returns the managed object model for the application. 
     If the model doesn't already exist, it is created by merging all of the models found in the application bundle. 
     */ 
     - (NSManagedObjectModel *)managedObjectModel { 

      if (managedObjectModel != nil) { 
       return managedObjectModel; 
      } 
      managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];  
      return managedObjectModel; 
     } 

     ... 

     /** 
     Returns the persistent store coordinator for the application. 
     If the coordinator doesn't already exist, it is created and the application's store added to it. 
     */ 
     - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

      if (persistentStoreCoordinator != nil) { 
       return persistentStoreCoordinator; 
      } 




      NSURL *storeUrl = [NSURL fileURLWithPath: [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) lastObject] stringByAppendingPathComponent: @"myapp.sqlite"]]; 

      NSLog(@"App Store URL : %@", storeUrl); 

      NSError *error = nil; 
      persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; 


      NSDictionary *storeOptions; 
      storeOptions = @{ 
          NSMigratePersistentStoresAutomaticallyOption : @YES, 
          NSInferMappingModelAutomaticallyOption : @YES, 
          NSPersistentStoreUbiquitousContentNameKey: @"AppCloudStore" 
          }; 
      #ifdef FREE 
      storeOptions = @{ 
          NSMigratePersistentStoresAutomaticallyOption : @YES, 
          NSInferMappingModelAutomaticallyOption : @YES, 
          NSPersistentStoreUbiquitousContentNameKey: @"FreeAppCloudStore" 
          }; 
      #endif 

      // Register for Notifications 
      NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

      [notificationCenter addObserver:self 
            selector:@selector(storesDidChange:) 
             name:NSPersistentStoreCoordinatorStoresDidChangeNotification 
            object:self.persistentStoreCoordinator]; 

      [notificationCenter addObserver:self 
            selector:@selector(persistentStoreDidImportUbiquitousContentChanges:) 
             name:NSPersistentStoreDidImportUbiquitousContentChangesNotification 
            object:self.persistentStoreCoordinator]; 

      [notificationCenter addObserverForName:NSPersistentStoreCoordinatorStoresWillChangeNotification 
      object:self.persistentStoreCoordinator 
      queue:[NSOperationQueue mainQueue] 
      usingBlock:^(NSNotification *note) { 
       NSLog(@"Stores Will Change..."); 

        if ([self.managedObjectContext hasChanges]) { 
         NSError *saveError; 
         if (![self.managedObjectContext save:&saveError]) { 
          NSLog(@"Save error: %@", saveError); 
         } 
        } else { 
         // drop any managed object references 
         [self.managedObjectContext reset]; 
        } 

      }]; 


      NSPersistentStore *store = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:storeOptions error:&error]; 

      if (store == nil || error != nil) { 
       NSLog(@"Error: %@, %@", error, [error userInfo]); 
       abort(); 
      } 


      NSURL *finaliCloudURL = [store URL]; 
      NSLog(@"Created persistent store okay. Final iCloud URL is: %@", finaliCloudURL); 

      return persistentStoreCoordinator; 
     } 

    ... 

    - (void)persistentStoreDidImportUbiquitousContentChanges:(NSNotification *)notification { 

     NSLog(@"persistentStoreDidImportUbiquitousContentChanges: Called. Content has changed via Core Data iCloud: *******************************************"); 

      // Received and merge updates from iCloud 
      [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]; 
      [self notifyAndRefreshAllDataDueToCloudEvent]; 
    } 

    ... 

    - (void)storesDidChange:(NSNotification *)notification { 

     // Tell me: why did my stores changes? 
     NSNumber *transitionType = [notification.userInfo objectForKey:NSPersistentStoreUbiquitousTransitionTypeKey]; 
     int theCause = [transitionType intValue]; 

     NSLog(@"storesDidChange: NSPersistentStoreCoordinatorStoresDidChange Notification = %@", notification); 

     switch (theCause) { 
      case NSPersistentStoreUbiquitousTransitionTypeAccountAdded: { 
       NSLog(@"storesDidChange: Account Added"); 
       // account was added 
      } 
       break; 
      case NSPersistentStoreUbiquitousTransitionTypeAccountRemoved: { 
       NSLog(@"storesDidChange: Account Removed"); 
       // account was removed 
      } 
       break; 
      case NSPersistentStoreUbiquitousTransitionTypeContentRemoved: { 
       NSLog(@"storesDidChange: Content Removed"); 
       // content was removed 
      } 
       break; 
      case NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted: { 
       NSLog(@"storesDidChange: Initial Import:"); 
       // initial import 
      } 
       break; 

      default: 
       break; 

     } 

    ... 

     [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"*****DidChangeByPersistentStoreChangesNotification" 
     object:self]; 

     [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"*****DidChangeByPersistentStoreChangesNotification" 
     object:self]; 

     [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"*****DidChangeByPersistentStoreChangesNotification" 
     object:self]; 

    } 

registro più dettagliato:

2015-05-12 10:22:23.367 [4972:2014228] storesDidChange: NSPersistentStoreCoordinatorStoresDidChange Notification = NSConcreteNotification 0x17005f470 {name = NSPersistentStoreCoordinatorStoresDidChangeNotification; object = <NSPersistentStoreCoordinator: 0x170072100>; userInfo = { 
    added =  (
     "<NSSQLCore: 0x12dd100b0> (URL: file:///var/mobile/Containers/Data/Application/****/Documents/CoreDataUbiquitySupport/mobile~****-7B78C4F2FDB2/FreeAppCloudStore/2***/store/app.sqlite)" 
    ); 
}} 
2015-05-12 10:22:23.409 [4972:2014228] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity: mobile~****:FreeAppCloudStore 
Using local storage: 1 
2015-05-12 10:22:23.410 [4972:2014228] Created persistent store okay. Final iCloud URL is: file:///var/mobile/Containers/Data/Application/****/store/app.sqlite 
2015-05-12 10:22:23.477 [4972:2014228] AppTableViewController:viewWillAppear: enter 
2015-05-12 10:22:23.478 [4972:2014228] getSharedAdBannerView: enter 
2015-05-12 10:22:23.518 [4972:2014228] queryDidUpdate: MSMetadataQuery Notification: - NSMetadataQueryDidFinishGatheringNotification 
2015-05-12 10:22:23.519 [4972:2014228] queryDidUpdate: NSMetadataQuery returned 25 results 
2015-05-12 10:22:23.524 [4972:2014228] setProcessTimer: 15.000000 
2015-05-12 10:22:23.531 [4972:2014228] TableViewController:viewDidAppear: enter 
2015-05-12 10:22:23.531 [4972:2014228] TableViewController:loadData (or reload): enter 
2015-05-12 10:22:23.582 [4972:2014294] CoreData: iCloud: Error: initial sync notification returned an error (Error Domain=BRCloudDocsErrorDomain Code=12 "The operation couldn't be completed. (BRCloudDocsErrorDomain error 12.)") 
2015-05-12 10:22:23.594 [4972:2014294] -[PFUbiquitySetupAssistant finishSetupWithRetry:](826): CoreData: Ubiquity: <PFUbiquitySetupAssistant: 0x12de18940>: Retrying after delay: 60 
Error Domain=BRCloudDocsErrorDomain Code=12 "The operation couldn't be completed. (BRCloudDocsErrorDomain error 12.)" 
2015-05-12 10:22:23.854 [4972:2014228] didFailToReceiveAdWithError 
2015-05-12 10:22:55.150 [4972:2014228] bannerViewDidLoadAd 
2015-05-12 10:23:24.178 [4972:2014228] queryDidUpdate: MSMetadataQuery Notification: - NSMetadataQueryDidUpdateNotification 
2015-05-12 10:23:24.178 [4972:2014228] queryDidUpdate: NSMetadataQuery returned 25 results 
2015-05-12 10:23:25.039 [4972:2014228] Stores Will Change... 
2015-05-12 10:23:25.101 [4972:2014228] storesDidChange: NSPersistentStoreCoordinatorStoresDidChange Notification = NSConcreteNotification 0x170254940 {name = NSPersistentStoreCoordinatorStoresDidChangeNotification; object = <NSPersistentStoreCoordinator: 0x170072100>; userInfo = { 
    NSPersistentStoreUbiquitousTransitionTypeKey = 4; 
    added =  (
     "<NSSQLCore: 0x12dd100b0> (URL: file:///var/mobile/Containers/Data/Application/****/FreeAppCloudStore/20EF5D1C-4748-4AB2-BCE1-91B228437D77/store/app.sqlite)" 
    ); 
    removed =  (
     "<NSSQLCore: 0x12dd100b0> (URL: file:///var/mobile/Containers/Data/Application/*****/store/app.sqlite)" 
    ); 
}} 
2015-05-12 10:23:25.101 [4972:2014646] -[PFUbiquitySwitchboardEntryMetadata setUseLocalStorage:](808): CoreData: Ubiquity: mobile~*****FreeAppCloudStore 
Using local storage: 0 
+0

sembra che funziona come previsto, che è la seguente: - Dispositivo apre il negozio di iCloud - Core Data crea un negozio locale temporanea e lo rende disponibile per l'applicazione (utilizzando l'archiviazione locale: 1 messaggio) immediatamente - Nucleo Quindi i dati creano un archivio iCloud (copia locale) e scarica tutti i dati dell'archivio di base e i file di registro e li importa - Quindi i dati principali uniscono l'archivio temporaneo con l'archivio iCloud locale e cambiano l'app per usarlo (Usando il negozio locale: 0 messaggio E gli errori dei dati di base potrebbero essere correlati all'attesa del download dell'archivio di base iCloud e dei registri. Solitamente solo informazioni. –

+1

L'app con iCloud/NSSQLiteStoreType funziona perfettamente con l'eccezione del timeout di 60 secondi descritto. Non credo che iCloud debba avere un errore, quindi riprovare tra 60 secondi, "Nuovo tentativo dopo il ritardo: 60" Ho utenti di app che commentano tramite email e recensioni che hanno perso i dati delle app che sospetto sia semplicemente dovuto al timeout e loro non lo sto aspettando. Spero che qualcuno possa aver visto questi errori. Grazie per il tuo commento. –

+0

Apple non fornisce alcun contratto sul livello di servizio in cui si afferma che la sincronizzazione di iCloud avverrà entro un periodo di tempo definito. Nei miei test i periodi di attesa possono essere molto più lunghi degli anni '60. Esegui una query sui metadati per cercare i file iCloud non ancora scaricati. Ovviamente il tuo utente deve avere accesso a iCloud per farlo. Se è così puoi monitorare lo stato del download e una volta scaricati le cose sono in genere piuttosto veloci. Dai un'occhiata a questo sito per alcune applicazioni di esempio. http://ossh.com.au/design-and-technology/softw re-sviluppo/sample-library-style-ios-core-data-app-with-icloud-integration/ –

risposta

23

Spero che la mia risposta non può risparmiare un sacco di tempo per coloro che gestiscono in questo errore.

Questo errore si verifica quando il tempo tra la rimozione e l'installazione dell'applicazione è inferiore a un determinato intervallo. Non so se è uguale a me, il mio era di 15 secondi.

Errore stupido, uno spreco di poche ore.

+0

Questo è davvero interessante. Grazie per la risposta qui e anche se non era la mia domanda, sto avendo lo stesso problema. Hai qualche idea sui dati mancanti con iCloud/Core Data? Anche se potrebbe trattarsi di un problema separato, la domanda ha gli stessi problemi con cui mi trovo. Quando si aggiorna alla versione App Store, tutti i dati non sono più nell'app – amitsbajaj

+2

Allo stesso tempo ci sono alcune conseguenze quando si ignora questo messaggio di errore. Prova per il caso in cui gli utenti aggiungono nuovi record tra il "periodo di errore". A volte questi record spariscono appena dopo iCloud ricomincia a sincronizzare. –

+0

Questo spiega molto. Grazie, la tua risposta è stata di grande aiuto. – sumofighter666