假设你有一个100个关卡的游戏,如果游戏要求你在换设备时需要重新闯关,相信对你来说这将是件很痛苦的事情。开发者可以通过使用Cognito同步所有设备上的关卡,实现可随时在任何设备上继续上次中断的功能,从而解决数据同步的问题。
创建身份池
第一步是创建身份池,所有用户的身份都在这个身份池里,每个终端用户都有自己的身份。通常,身份池跟某一个移动应用有关,但为了弥补不同应用间的数据同步问题,最好是只创建一个身份池而不是每个应用创建一个身份池。如果你还没有创建过身份池,请参见亚马逊官方资料:Amazon Cognito Console
为了能够跨设备同步数据,你的身份池必须支持身份验证。未经身份验证的身份是与设备绑定,也就是说如果用户身份未被验证,数据就不能跨设备同步。创建身份池一定要确定配置了一个或多个身份供应商,这个页面将引导你完成获取所需应用ID或客户ID的Amazon,Facebook或Google设置。
创建身份池时,它会要求你为终端用户创建一个新的或选一个已存在的IAMRole,这个Role定义了终端用户/应用获取临时证书时被授予的AWS服务和许可权限。默认策略允许访问Amazon Cognito同步服务并允许向Amazon Mobile Analytics发出事件,一般情况下至少需要能够访问AmazonCognito同步服务的策略。
在身份池创建过程结束时,你会在应用程序中收到一些样本代码,记得把它们保存下来,因为接下来将会用到。
同步数据
如果你没有提前准备,请先下载并安装AWS Mobile SDK。Android或iOS的安装说明见链接:http://docs.aws.amazon.com/mobile/sdkforios/developerguide/setup.html
安装并配置完开发环境后,你需要在应用中实例化Cognito证书供应商。直接将上面控制台中获取的样板代码放到你的应用程序中即可。代码如下:
Androidimport com.amazonaws.android.auth.CognitoCredentialsProvider;CognitoCredentialsProvider cognitoProvider = new CognitoCredentialsProvider(myActivity.getContext(), // get the context for the current activity"AWSACCOUNTID","region:identity-pool-id","arn:aws:iam::AWSACCOUNTID:role/UnauthRole", "arn:aws:iam::AWSACCOUNTID:role/AuthRole");iOS#import <AWSiOSSDKv2/AWSCore.h>AWSCognitoCredentialsProvider *credentialsProvider = [AWSCognitoCredentialsProvidercredentialsWithRegionType:AWSRegionUSEast1accountId:@"AWSACCOUNTID"identityPoolId:@"region:your-identity-pool-id"unauthRoleArn:@"arn:aws:iam::AWSACCOUNTID:role/UnauthRole",authRoleArn:@"arn:aws:iam::AWSACCOUNTID:role/AuthRole"];AWSServiceConfiguration *configuration = [AWSServiceConfigurationconfigurationWithRegion:AWSRegionUSEast1 credentialsProvider:credentialsProvider];[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;下一步是提示用户随着身份供应商登陆并提供带有登陆token的Cognito证书供应商。这个过程根据身份供应商的不同而不同。
Android参考资料:
http://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-auth.html
iOS参考资料:
http://docs.aws.amazon.com/mobile/sdkforios/developerguide/cognito-auth.html
Androidimport com.amazonaws.android.cognito.*;//COGNITO_POOL_ID is a constant set to your Cognito Pool Id//provider is the provider you just initializedCognitoSyncClient syncClient = new DefaultCognitoSyncClient(myActivity.getContext(),COGNITO_POOL_ID, cognitoProvider);iOS#import <AWSiOSSDKv2/AWSCore.h>#import <AWSCognitoSync/Cognito.h>AWSCognito *syncClient = [AWSCognito defaultCognito];使用同步客户端可以打开并操作一个数据集。
AndroidDataset dataset = client.openOrCreateDataset("GameInfo");//call this once when you open the dataset to get the latest data from the clouddataset.synchronize(this, syncCallback);dataset.put("playerName","David");dataset.put("currentLevel","29");dataset.put("highScore","120345");//now synchronize this data to make it available to other devicesdataset.synchronize(this, syncCallback); syncCallback对象需要实现SyncCallback接口,它会在同步成功、失败、冲突、或其他情况时被调用。详细的实现接口过程参见:https://docs.aws.amazon.com/mobile/sdkforandroid/developerguide/cognito-sync.htmliOSAWSCognitoDataset *dataset = [syncClient openOrCreateDataset:@"GameInfo"];//call this once when you open the dataset to get the latest data from the cloud[dataset synchronize];[dataset setString:@"David" forKey:@"playerName"];[dataset setString:@"29" forKey:@"currentLevel"];[dataset setString:@"120345" forKey:@"highScore"];//now synchronize this data to make it available to other devices至此,我们已经在数据集GameInfo中存入了三组key-value,如何从其他设备同步数据?这和访问其它设备上数据的过程是一样的,一旦打开程序集并完成同步,就可以获取一个特定的键值,比如:Android
String playerName = dataset.get("playerName");String currentLevel = dataset.put("currentLevel");String highScore = dataset.put("highScore");iOSNSString *playerName = [dataset stringForKey:@"playerName"];NSString *currentLevel = [dataset stringForKey:@"currentLevel"];NSString *highScore = [dataset stringForKey:@"highScore"];
因为Cognito将数据存储在本地及服务器端,因此你可以在离线状态下继续数据交互。离线数据可能会过期,但所有放入数据集中的数据,都可以在线上或线下状态下立即获取。
程序示例
下面的案例说明了如何同步Android和iOS数据,它们都是将数据同步到应用中很好的参考信息,还包括了两个没有在这篇文章中提到的主题——冲突解决方案和身份合并处理方法。
Android
Github Cognito Android Sample:
https://github.com/awslabs/aws-sdk-android-samples/tree/master/CognitoSyncDemo
iOS
Github Cognito iOS Sample:
https://github.com/awslabs/aws-sdk-ios-samples/tree/master/CognitoSyncDemo
局限性
使用同步功能时,以下几个限制因素值得注意一下:
1. 每个身份最多拥有20个数据集;
2. 每个数据集最多有1024组key-value;
3. 数据集中合并后的keys和values大小不能超过1MB;
总结
在Amazon Cognito中,跨移动设备间的数据同步变得很容易,有兴趣的同学可以尝试一下,在评论中发表你们的使用体验。
原文链接:https://medium.com/aws-activate-startup-blog/amazon-cognito-mobile-apps-part2-user-state-data-synchronization-581bdd97afc2
特别推荐:【AWS移动开发公开课】第一讲:用户身份及简单AWS身份验证http://www.csdn.net/article/2014-09-12/2821672
如您需要了解AWS最新资讯或是技术文档可访问AWS中文技术社区;如您有更多的疑问请在AWS技术论坛提出,稍后会有专家进行答疑。
订阅“AWS中文技术社区”微信公众号,实时掌握AWS技术及产品消息!
AWS中文技术社区为广大开发者提供了一个Amazon Web Service技术交流平台,推送AWS最新资讯、技术视频、技术文档、精彩技术博文等相关精彩内容,更有AWS社区专家与您直接沟通交流!快加入AWS中文技术社区,更快更好的了解AWS云计算技术。
(译者/应玲 责编/王玉平)