更多iCloud的核心数据synching困境(More iCloud Core Data sync

2019-07-18 14:09发布

因此,它终于发生了。 发生了任何独立的iPhone开发者最糟糕的情况。 一些用户正在升级我的应用程序后,报告数据完全丢失 。 iCloud的核心数据同步不工作。 我的用户都在使用这个应用程序部分来运行他们的业务。 这是一个真正的灾难性故障

唯一的iCloud相关的事情我改变是对键值存储添加到iCloud。 核心数据代码仍然完全一样的,同样的模型版本(没有迁移)等

在我的测试一切正常一级棒! 但我失望的是,用户报告说,当他们打开更新后的应用他们的数据是不存在了。

可能是什么原因呢?

  • 持久性存储URL(无处不URL)不应该改变。
  • 合并冲突也是不可能的,因为这个问题应该在更新之前已经出现。
  • 无处不在的key-value存储也许有些干扰?
    (我几乎排除了这一可能性。)

下面请找出我的管理对象模型和持久性存储的代码。 让我知道如果你需要什么要对问题进行评估。

- (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_;
}

- (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_;
}

评论,意见,乱撞等(当然的解决方案!)都欢迎。

更新:

我的一个客户失去了所有的数据,并重新安装和重新一切(重启设备等)后,他无法与iCloud的任何更多的同步。 符号根本不设置显示出来。

Answer 1:

我正面临着很少使用类似的东西(通过你的描述我假定你有更多的方式卷比我还多,这是可能的几种情况的原因)

在我而言似乎苹果没有更早通知已删除的icloud的20GB的可用空间。 我注意到,2种用途谁是电力数据使用用户已经从我的应用程序(这是处理历史股票价格),其他那些我们就好了下载相同的数据大小丢失新数据。

我跟进的2,帮助他们清理东西了,让iCloud中,瞧更多的空间,在下载数据后,再次它工作得很好。



文章来源: More iCloud Core Data synching woes