iCloud 纪录

iCloud的学习主要是Apple的官方文档+devform,常规的操作和流程请参见文档。

这里纪录下iCloud开发中自己遇到的问题和需要注意的地方,有不对的地方,欢迎指正,也欢迎大家交流。

2012-02-07 10:25:24

1 支持iCLoud功能的应用首先要检测下iCloud是否可用,需要用到

-[NSFileManager URLForUbiquityContainerIdentifier:];这个最好在次线程中做,否则有可能会阻塞主线程。

这个苹果的文档最近也给出了例子:

检测iCloud
1 dispatch_async(dispatch_get_main_queue(), ^{
2 if ([[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil])
3 NSLog(@"iCloud is available.\n");
4 else
5 NSLog(@"iCloud is not available.\n");
6 });

2 文件上传到iCloud

可以直接在iCloud下创建文件;

在App沙盒内创建,然后使用 -[NSFileManager setUbiquitous:itemAtURL:destinationURL:error:]上传至iCloud;

使用 -[UIDocument saveToURL:forSaveOperation:completionHandler:];

3 NSFileCoordinator

检测某个文件夹内容的更新时,其实检测的时文件夹内的任一文件的更新,包括子文件夹的文件。

某一个文件下载完成后,presentedSubitemDidChangeAtURL:还会再调用一下,所以在做页面更新之前,要根据URL做一个判断。

4 iCloud文件的下载

文档上说有两种方法:

  1. 使用UIDocument的openWithCompletionHandler:方法
  2. NSFileManager的startDownloadingUbiquitousItemAtURL:方法。

openWithCompletionHandler:方法需要在主线程中调用,因为这个函数本身执行的是异步操作,block里的内容是会在后台执行的。

需要注意的是,调用了openWithCompletionHandler:后,如果想使用NSMetadataQuery去查询文件的进度,是查询不到的。

相反调用startDownloadingUbiquitousItemAtURL:后,Query是可以查询到的

5NSMetadataQuery

query要在主线程中start,否则不会响应回调函数。

或者有可能在次线程开始查询的时候,需要对runloop进行处理,这个没有仔细尝试

6 -[NSURL  getResourceValue:forKey:error:]

5.0以后新增了这个函数,可以查询文件是否已经下载,下载的进度。

但是似乎函数不可用,比如查询NSURLUbiquitousItemPercentDownloadedKey的值,始终是零

7 文件冲突处理

用& 操作文件的状态,从而做出响应的动作。

值得注意的是,如果文件状态是Closed,那么需要将此文件关闭

8 iCloud的配置

文档里有详细说明如何配置entitlement和App的bundle identifier.

如果只配置一个container,在获取ubiquitousURL时可传参 nil。

如果配置多个container,则需要指定container的字符串,规则是:“teamID”.container里的某一个值。

 

2012-02-08 10:08:43

先纪录这么多,还有其他一些问题需要注意,但是尚未弄清楚原因,待以后补充。

 

 



你可能感兴趣的:(icloud)