使用iCloudKeyValueStore存储应用程序数据

使用iCloud的KeyValueStore,可以实现不同设备上的app instance共享同一份数据。当然,前提是要用户登录了iCloud账号,并且启用了文稿与数据功能。

应用如何探测当前设备是否允许其使用iCloud服务?
http://stackoverflow.com/questions/7819939/how-to-check-if-icloud-is-configured-programmatically

    BOOL iCloudEnabledForThisApp = [[NSFileManager defaultManager] ubiquityIdentityToken] != nil;

可以用以上代码在模拟器和未登录iCloud的真机测试,返回值是NO。

接下来讲一下给应用配置iCloud的步骤。

创建一个iCloud Container:
QQ20140611-3

为你的Bundle Id启用iCloud service,并把创建的iCloud Container加进去:
QQ20140611-4

生成profile供打包使用,这里演示的development的profile,可以明确看到配置了iCloud:
QQ20140611-5

 

XCode中配置entitlements,Capabilities中启用iCloud,勾选User key-value store,并在Ubiquity Containers中添加你刚才在iTC中创建的Container ID。对于这个Container ID,iTC中会自动加上iCloud.前缀,而这里则无需填写iCloud.前缀。
QQ20140611-1

然后看一下Build Settings中的Code Signing Entitlements项,应该已经帮你配置好了。
QQ20140611-2

Ok,把Profile也设置好后,就可以在真机进行测试了。

下面说一下基本的API。

直接上代码,以下示例会通过NSUbiquitousKeyValueStore往iCloud store中写入一个key,然后调用[store synchronize];强制同步。我们只能让NSUbiquitousKeyValueStore进行同步,但它到底何时同步无法保证。等待一会儿后,退出程序。再次进入程序后,会从iCloud store中获取刚才写入的值,并用alert显示出来。

    if(iCloudEnabledForThisApp) {
        
        NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
        
        NSString* key1 = [store stringForKey:@"key1"];
        if(key1) {
            UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"alert" message:key1 delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
            [alert show];
        } else {
            [store setString:@"laoyur.ml" forKey:@"key1"];
            [store synchronize];
        }
    } else {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"alert" message:@"iCloud not enabled!" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
        [alert show];
    }

为了保持多app instance之间数据同步,那必然还得使用其通知API,这里就不复述了。

对了,还有iCloud的限制也必须明了:

  1. 它最多能存储1M的数据,最多可以同时存储1024个键(Key),单个值不能超过1M。
  2. 单个键的长度在UTF8编码时不能超过64个字节
  3. 当你注册NSUbiquitousKeyValueStoreDidChangeExternallyNotification监听时务必要指定默认的NSUbiquitousKeyValueStore对象(通过类方法defaultStore获取)为要监听的对象
  4. 同步方法synchronize并没有立刻将所有的设置都写入iCloud,而只是保存到磁盘。可能需要一段时间才能和iCloud同步。

提供几个有用的链接:
https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUbiquitousKeyValueStore_class/Reference/Reference.html

http://iiiyu.com/2013/09/02/learning-ios-notes-twenty-seven/

http://blog.xcodev.com/archives/using-nsubiquitous-key-value-store/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.