iCloud键值同步iOS8 Xcode 6

时间:2014-10-18 12:49:48

标签: objective-c iphone xcode icloud

尝试修复iCloud的一些问题。这是我的代码的两个版本。

- (void)viewDidLoad{

    [super viewDidLoad];

    [self checkICloudData];
}

版本1

- (void)checkICloudData
{
    NSFileManager * fileManager=[NSFileManager defaultManager];

    NSURL *iCloudURL=[fileManager URLForUbiquityContainerIdentifier:nil];

    NSLog(@"iCloud URL is %@",[iCloudURL absoluteString]);

    if (iCloudURL){

        NSUbiquitousKeyValueStore * store=[NSUbiquitousKeyValueStore defaultStore];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(updateICloudData:)
                                                     name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification
                                                   object:store];
        [store synchronize];
    }else{
        NSLog(@"iCloud is not supported or enabled");
        [self loadDataFromBundle];

    }
}

iCloudURL总是返回nil。其他方法不会调用。

第2版

- (void)checkICloudData
{   
    NSUbiquitousKeyValueStore * store=[NSUbiquitousKeyValueStore defaultStore];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(updateICloudData:)
                                                 name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification
                                               object:store];
    [store synchronize];
}

- (void)updateICloudData:(NSNotification*)notification
{
    NSDictionary *userInfo = [notification userInfo];
    NSNumber *changeReason = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey];
    NSInteger reason = -1;

    if (!changeReason) {
        return;
    } else {
        reason = [changeReason integerValue];
    }

    if ((reason == NSUbiquitousKeyValueStoreServerChange) || (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
        NSArray *changedKeys = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangedKeysKey];

        for (NSString *key in changedKeys) {
            if ([key isEqualToString:casesKey]) {
                [self iCloudNotification];
            }else {
                [self loadDataFromBundle];

            }
        }
    }
}

使用该版本,iCloud同步可以与iPad配合使用,但不能与iPhone配合使用。在iPhone的iCloud Drive设置中,我看到我的应用程序与iPad中的相同

我的iCloud设置:

  1. 会员中心 - 启用iCloud。兼容性 - 包括CloudKit支持

  2. 目标功能 - 仅检查服务键值存储

  3. 默认情况下创建的权利字典包含密钥com.apple.developer.icloud-container-identifiers,其中包含一个空数组和密钥com.apple.developer.ubiquity -kvstore-identifier,其正确的字符串值为my appID < / p>

  4. 那么,为什么iCloudURL总是返回nil?为什么第二个版本适用于iPad,但我的iPhone没有看到NSUbiquitousKeyValueStoreDidChangeExternallyNotification?

1 个答案:

答案 0 :(得分:0)

嗯,升级iOS后问题出在我的iPhone上。

当我从iPhone的设置中删除iCloud配置文件并再次添加时,iPhone开始与iCloud同步。

目前,该代码的第二个版本适用于这两种设备。

希望有人帮助解决这类问题。