苹果iOS上的iCloud对于应用有几层意义:

1、App可以像以前和iTunes同步时一样,把App数据备份到iCloud上。这部分功能是所谓out-of-box, just works,无需app开发者进行任何支持的。

2、App开发者可以利用iCloud提供的接口将应用的文档放到云端。这样文档不仅是本地保存,还在云端拥有一份拷贝。在多个设备都使用同一app时,就可以通过iCloud来同步成最新的文档。这方面和代码版本控制软件比较类似。但和上一点不同,app开发者必须使用iCloud API进行支持。

3、这点其实是(2)的扩展。iCloud提供了云端文档存储空间,也就意味着可以和其他app共享文档。所以app开发者可以使用iCloud API将iCloud当作一种网络存储和分享的服务。

这里主要讲一下One Tap Hero里支持的功能(2)。

首先要初始化iCloud的支持。在iOS 5.0之前没有iCloud支持,而用户也可能没有登陆iCloud或者禁用iCloud文档同步。所以这一步必须最先做掉。基本上在[UIApplication applicationDidFinishLaunching: options:]中,加入这些实现即可:

- (void)checkiCloudAvailability

{

if ([[NSFileManager defaultManager] respondsToSelector:@selector(URLForUbiquityContainerIdentifier:)])

{

// get the global concurrent queue

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// get the ubiquity container asynchronously

dispatch_async(globalQueue, ^{

NSURL *container = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];

// update you app on the main thread with the result

dispatch_async(dispatch_get_main_queue(), ^{

[self updateWithUbiquityContainer:container];

});

});

}

}

- (void)updateWithUbiquityContainer:(NSURL*)container

{

if (container)

{

// continue with iCloud-specific setup

NSLog(@"iCloud access at %@", container);

self.ubiquityContainer = container;

if (icloud_ready_callback)

{

icloud_ready_callback(container);

}

}

else

{

// iCloud is not available

// continue with non-iCloud setup

NSLog(@"No iCloud access");

self.ubiquityContainer = nil;

}

}

其次我们要适应一下iCloud的文件系统接口。我们不能用传统的fopen或者std::out来操作文件,而是要使用另一套API来操作。这套API为何要这样设计我不清楚,但应该是受到spotlight以及网络搜索引擎的影响。

最后我们要适应的是几乎全异步的API。由于网络延迟,iCloud API被设计成大量使用ObjC block的形式。这点和Game Center很像。

没有了fopen,我们打开文件的操作就要分为3个步骤:

a、使用NSMetaQuery和NSPredicate找到云端的文件(异步)。

b、在NSNotificationCenter注册NSMetadataQueryDidFinishGatheringNotification和NSMetadataQueryDidUpdateNotification事件监听(异步)

c、在事件监听函数中,使用UIDocument(或自己实现NSFilePresenter)打开或创建文件(异步),打开函数为

-(void) openWithCompletionHandler:^(BOOL success) ();

创建函数其实和存盘函数一样,为

-(void) saveToURL: forSaveOperation: completionHandler:^(BOOL success) ();

但其中forSaveOperation参数必须传UIDocumentSaveForCreating。

创建或打开文件之后,我们对文档的操作就和平常类似,通过重写UIDocument的

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError

来分别定义文档内容的读、写。而依旧通过UIDocument的public接口

-(void) openWithCompletionHandler:^(BOOL success) () ;

-(void) saveToURL: forSaveOperation: completionHandler:^(BOOL success) ();

来实际调用读、写操作。

到此为止,iCloud文件的创建、打开、读、写都已完成。但尚缺最重要的一步,也是最麻烦的一步——就是异常处理。

云服务必须处理异常和版本冲突的问题,这是不可避免的。所以iCloud提供了NSNotificationCenter里的UIDocumentStateChangedNotification来处理UIDocument的异常。所以通常我们都在正常查询到文件之后,注册这个事件的处理函数。

在这个处理函数中,我们有2个必须知道的文档状态:UIDocumentStateNormal和UIDocumentStateInConflict

UIDocumentStateInConflict意味着iCloud中有多个冲突的版本,必须通过NSFileVersion把冲突版本的resolved属性都置为YES,iCloud才会转变UIDocumentState。而具体如何解决冲突,则按每个app不同而不同。

UIDocumentStateNormal意味着iCloud文档状态正常。通常情况下,以及解决冲突后,文档都会是UIDocumentStateNormal状态。

至此iCloud的基本支持已完成。下面说一些实现陷阱和遇到的问题。

1、iCloud本身没有提供DAG模型的版本管理,必须用户自己实现。这点上One Tap Hero没有做,所以在处理同步冲突时,只能merge一些过关数据(如星星、最高分等),而无法同步金币等数值(无版本控制则这类数值的合并无正确的语义)。

2、iCloud在一些情况下很容易卡死,特别是API调用不合理的情况下。解决方法是换文件或reset device。例如在UIDocumentStateNormal时调用[UIDocument saveToURL]这种IO操作,似乎就很容易出现iCloud卡死的情况。这点不知是否会在iOS 6.0中加以改进。

转载于:https://www.cnblogs.com/eygneph/archive/2012/07/07/2580748.html

支持iCloud简记相关推荐

  1. iCloud配置问题(iOS 支持iCloud)

    关于iOS支持iCloud Drive配置问题 首先解释下:iCloud是什么?有何作用? iCloud是苹果公司所提供的云端服务,使用者可以免费储存5GB的资料. 可以备份存放照片.音乐.通讯录.短 ...

  2. 使新版Edge支持iCloud同步

    使新版Edge支持iCloud同步 导入注册表文件(xx.reg) Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\W ...

  3. iRemoval PRO v3.9.3,一键绕过iOS12.0~14.8,支持登入iCloud有消息通知

    iRemoval PRO v3.9.3这款工具可以用来帮助因为忘记自己的ID或者密码,而导致iPhone/iPad无法激活的工具来绕过自己的iPhone/iPad. 支持的设备型号有iPhone5S~ ...

  4. minaRActivator2.1完美解4G信号,可以登录iCloud,有消息通知,支持IOS16.5

    Mina Ramdisk Activator是由Mina团队开发的一款iOS16.5系统绕过激活锁界面的解锁工具,可以激活所有IPAD/苹果手机二网/三网恢复信号,并且支持插卡接打电话.收发短信.4G ...

  5. iCloud官方文档

    官方地址: iOS App Programming Guide -> iCloud Storage 这个偏理论一些,提供了很多iCloud应用设计层面的东西,大家感兴趣,可以一看. 如果需要iC ...

  6. Apple Configurator 2下载 Apple Configurator 2 for mac官方最新版 支持M1

    Apple Configurator 是一个苹果官方推出的免费的配置和部署工具,能帮助您轻松实现在学校.企业或机构中大量配置和部署 iPhone.iPad 和 iPod touch.只需三个简单的工作 ...

  7. pc工具不支持stb的加密方式_那些工作中常用的实用工具

    DESIGN 古人云:工欲善其事,必先利其器.俗话说:巧妇难为无米之炊.两句话都讲的是,做专业的事,要有专业的工具,保证品质的同时呢,又能提高生产效率.作为一名设计师,同样需要专业的工具输出我们的产品 ...

  8. 多种方法让你在PC上使用iCloud服务

    多种方法让你在Windows上优雅的使用iCloud服务 我平时习惯使用 日历.待办事项+2Do 等App,而在Windows上无法使用它们. 由于我爱好各种大型单机游戏,所以短时间内不会选择更换Ma ...

  9. iCloud Drive,简单实用的苹果原生云存储

    iCloud Drive,简单实用的苹果原生云存储 当前,各类网络云存储五花八门.数不胜数,Dropbox,One Drive,Google Drive等,各有优劣,让我这种有选择恐惧症的人相当抓狂. ...

最新文章

  1. Python基础教程(第3版)之一些内置的异常类
  2. Thoughtworks 正式成为阿里云云原生核心合作伙伴
  3. js基础---数组方法
  4. AzCopy – 上传/下载 Windows Azure Blob 文件
  5. Java笔记-Java通过JNI调用Linux上so文件
  6. 攻防世界 适合做桌面_网络安全工程师教你:如何使用Kali Linux进行渗透测试与攻防实战...
  7. MFC工作笔记0011---atoi的用法
  8. Ubuntu 11.10 make menuconfig 失败的解决方法
  9. TortoiseSVN使用教程
  10. GoF设计模式——适配器模式(C++实现)
  11. R语言与临床模型预测——LASSO回归,单因素多因素cox,差异表达分析,Venn图,森林图,列线图,矫正曲线,ROC全套代码及解析——第五部分 批量cox回归分析 本专栏可免费答疑
  12. MySQL中用生日计算年龄
  13. C51单片机实现 贪吃蛇
  14. VB编程编辑AutoCAD样条曲线
  15. 编程的智慧 强烈推荐
  16. 关于wlw(windows live writer):“无法连接到您的日志服务:服务器响应无效”的解决方案
  17. 小米mix2s支持html,小米MIX2S支持无线充电吗?米粉欢呼!
  18. UML九图之三(状态图)
  19. 精选汇总文章(更新于2019-08-09)
  20. 心肺复苏急救知识培训PPT模板

热门文章

  1. DB2查询主键、索引、表约束
  2. iframe子页面获取父页面元素,或父页面获取iframe子页面的元素
  3. idea工具修改Git路径
  4. fastjson php,Fastjson 对象或数组转JSON
  5. 【基础】算法的时间复杂度分析
  6. 【POJ3190】Stall Reservations
  7. eclipse配置python开发环境_Eclipse中配置python开发环境详解
  8. python科学计算库-python 科学计算基础库安装
  9. 服务器开机信号,机柜服务器BMC开关机控制系统及方法
  10. window下的免安装redis