Mais problemas de sincronização do iCloud Core Data
Então, finalmente aconteceu. O pior cenário possível para qualquer desenvolvedor independente de iPhone ocorreu. Vários usuários estão relatando completaperda de dados depois de atualizar meu aplicativo. A sincronização do iCloud Core Data não está funcionando. Meus usuários estão usando este aplicativo parcialmente para administrar seus negócios. Isto é verdadeiramentefalha catastrófica.
A única coisa relacionada ao iCloud que alterei foi adicionar o armazenamento de valor-chave ao iCloud. O código de dados do núcleo permaneceu exatamente o mesmo, a mesma versão do modelo (sem migração) etc.
Nos meus testes tudo funcionou lindamente! Mas para meu espanto, os usuários informaram que seus dados não estavam mais lá quando eles abriram o aplicativo atualizado.
Qual poderia ser a razão disso?
oURL da loja persistente (um URL onipresente) não deveria ter mudado.Mesclar conflitos também são improváveis, já que esse problema deveria ter surgido antes da atualização.Alguma interferência com o novoarmazenamento de valor-chave onipresente possivelmente?(Eu praticamente descartei isso.)
Abaixo, localize o código do meu modelo de objeto gerenciado e do armazenamento persistente. Deixe-me saber se você precisar de mais alguma coisa para avaliar o 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_;
}
e
- (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_;
}
Comentários, opiniões, adivinhações selvagens, etc. (e, claro, soluções!) São bem-vindos.
ATUALIZAR:
Um dos meus clientes perdeu todos os seus dados e depois de reinstalar e redefinir tudo (reinicializar o dispositivo, etc.), ele não conseguiu mais sincronizar com o iCloud. O símbolo simplesmente não aparece nas configurações.