Ios 如果用户未登录iCloud,为什么UbiquityContainer为零?

Ios 如果用户未登录iCloud,为什么UbiquityContainer为零?,ios,core-data,icloud,ubiquitycontainer,Ios,Core Data,Icloud,Ubiquitycontainer,我想使用UbiquityContainer对coredata进行iCloud备份。但是,如果我没有登录到模拟器上的iCloud,下面的ubContainer将保持为零 -(void)addSqliteStoreToPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)psc{ NSError *error = nil; NSFileManager *fm = [NSFileManager defaultManager

我想使用UbiquityContainer对coredata进行iCloud备份。但是,如果我没有登录到模拟器上的iCloud,下面的
ubContainer
将保持为零

-(void)addSqliteStoreToPersistentStoreCoordinator:(NSPersistentStoreCoordinator *)psc{
    NSError *error = nil;
    NSFileManager *fm = [NSFileManager defaultManager];
    NSURL *ubContainer = [fm URLForUbiquityContainerIdentifier:nil]; // Why nil???????
    NSURL *storeURL = [ubContainer URLByAppendingPathComponent:@"f11Remote.sqlite"];
    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
    [options setObject:[NSDictionary dictionaryWithObjectsAndKeys:@"FULL", @"synchronous", nil] forKey:NSSQLitePragmasOption];
    [options setObject:@"f11iCloudStore" forKey:NSPersistentStoreUbiquitousContentNameKey];
    [options setValue:ubContainer forKey:NSPersistentStoreUbiquitousContentURLKey];
    sqliteStore = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
    if (!sqliteStore)
        [NSException raise:@"FTDatastore: Couldn't open the local SQLite database." format:@"Reason: %@", [error localizedDescription]];
}

在用户登录到iCloud之前,我一直希望它的
离线版能够同时工作,并表现得像核心数据一样。可以做什么?

如果用户没有激活iCloud,您需要一个后备存储

NSURL *storeDirectory = [[NSFileManager defaultManager] 
                        URLForUbiquityContainerIdentifier:nil];
为什么
nil

如果为此参数指定
nil
,则此方法将返回
com.apple.developer.ubiquity容器标识符数组中列出的第一个容器

如果生成的URL为
nil
,则iCloud可能已禁用。您必须提供另一个URL

if (!storeDirectory) {
   storeDirectory = [self applicationDocumentsDirectory]; // implement yourself
   NSLog(@"Falling back to local store.");
}

如果用户未登录,则没有ubiquity容器。这就是为什么它是
nil
。用户可以登录几个可能的iClouds帐户之一。每个都有自己的容器。“可以做什么?”可以做什么?这正如预期的那样有效。有什么问题吗?好吧,这是一个可怕的体系结构:你必须在多个地方处理一个持久存储。但是,嘿,那是iCloud。@rmaddy,所以我必须推出一个普通的coredata容器,以防用户注销,并在他每次重新登录时将其迁移到iCloud?谢谢你解释得这么好+1如果iCloud被禁用,我同意实施回退到本地存储。但是,如果用户已使用iCloud并突然决定注销,我该怎么办。本地后备存储将是空的,他将无法看到自己的数据。对于这种情况,也许我也应该将iCloud数据迁移到本地数据存储。