sincronizar respaldo descargar cuenta contactos con apple iphone ios core-data synchronization icloud

iphone - respaldo - Más problemas de sincronización de iCloud Core Data



sincronizar contactos iphone icloud (1)

Estaba enfrentando algo similar con pocos usos (según su descripción, asumí que tiene mucho más volumen que yo, esa podría ser la razón de varios casos)

En mi caso, Apple parecía haber eliminado sin previo aviso el espacio libre de 20 gb en el icloud. Observé que los 2 usuarios que usan el uso de datos de energía habían perdido nuevos datos de mi aplicación (que era para lidiar con los precios históricos de las acciones) y los otros simplemente descargaban el mismo tamaño de datos.

Seguí con esos 2, ayudándolos a limpiar cosas para dejar más espacio en icloud y voila, después de descargar los datos otra vez funcionó bien.

Entonces, finalmente sucedió. El peor escenario posible para cualquier desarrollador independiente de iPhone ocurrió. Varios usuarios informan pérdida completa de datos después de actualizar mi aplicación. La sincronización de iCloud Core Data no funciona. Mis usuarios están usando esta aplicación parcialmente para ejecutar sus negocios. Esta es una falla verdaderamente catastrófica .

La única cosa relacionada con iCloud que cambié fue agregar el almacén de clave-valor a iCloud. El código de datos centrales permaneció exactamente igual, la misma versión del modelo (sin migración), etc.

¡En mis pruebas todo funcionó maravillosamente! Pero para mi sorpresa, los usuarios informaron que sus datos ya no estaban allí cuando abrieron la aplicación actualizada.

¿Cuál podría ser la razón de ésto?

  • La URL de tienda persistente (una URL ubicua) no debería haber cambiado.
  • Los conflictos de combinación también son poco probables, ya que este problema debería haber surgido antes de la actualización.
  • ¿Alguna interferencia con la nueva tienda de valores clave ubicua tal vez?
    (He descartado esto bastante)

A continuación, encuentre el código para mi modelo de objeto administrado y tienda persistente. Avíseme si necesita algo más para evaluar el problema.

- (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext_ != nil) { return managedObjectContext_; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [managedObjectContext_ performBlockAndWait:^{ [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; if (useICloud) { [managedObjectContext_ setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeiCloud:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:coordinator]; } }]; } return managedObjectContext_; }

y

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator_ != nil) { return persistentStoreCoordinator_; } NSMutableDictionary *options = [NSMutableDictionary dictionary]; NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"SalesCalls.sqlite"]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption]; [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption]; if (useICloud) { // this is an internal flag set to YES NSURL *iCloudURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; if (nil!=iCloudURL) { NSString *cloudData = [[iCloudURL path] stringByAppendingPathComponent:@"data"]; iCloudURL = [NSURL fileURLWithPath:cloudData]; [options setObject:@"at.topofmind.salesplus.store" forKey:NSPersistentStoreUbiquitousContentNameKey]; [options setObject:iCloudURL forKey:NSPersistentStoreUbiquitousContentURLKey]; NSURL *nosyncDir = [iCloudURL URLByAppendingPathComponent:@"data.nosync"]; [[NSFileManager defaultManager] createDirectoryAtURL:nosyncDir withIntermediateDirectories:YES attributes:nil error:nil]; storeURL = [nosyncDir URLByAppendingPathComponent:@"SalesCalls.sqlite"]; } } NSError *error = nil; persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSLog(@"Cannot create persistent store coordinator, %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator_; }

Comentarios, opiniones, conjeturas, etc. (¡y por supuesto soluciones!) Son bienvenidos.

ACTUALIZAR:

Uno de mis clientes perdió todos sus datos y después de volver a instalar y restablecer todo (reiniciar el dispositivo, etc.) ya no podía sincronizarse con iCloud. El símbolo simplemente no aparece en la Configuración.