iCloud 简介
- 苹果公司提供的云端服务,2011年正式发布
- 为苹果用户提供私有云空间,方便用户在不同设备共享个人数据
- 将音乐服务、系统备份、文件传输、笔记本和平板设备等各种产品有机结合在一起。
- 个人免费5GB
- Apple id 和 iCloud 账号是相互独立的,iCloud 账号可以通过Apple id登录,需要激活
CloudKit
- Store structured app and user data in iCloud containers that can be shared by all users of your app.(官方文档API说明)
- 基于iCloud的一个云端数据存储服务
- 组成:
- 一个web页面,用于管理公开数据的记录类型
- 一组API接口,用于iCloud和设备之间的数据传递
开始使用 CloudKit
开启CloudKit
XCode 配置
配置证书
找到当前的App ID然后对它进行编辑 打开iCloud的功能选择,并且选择Include CloudKit support,这边这时会有一个警告出现,选择右边的Edit进行编辑
进入Dashboard
两种进入方式:
- XCode Capabilities 里直接点CloudKit Dashboard进入
- 从苹果开发者网站进入
CloudKit Dashboard
SCHEMA:
- CloudKit 容器的高级类:Record Types, Security Roles, 和 Subscription Types ,其中主要使用的是Record Types;
- 一个Record Type用来定义一个单独的记录(可以理解为一个数据模型),相当于存储数据的模板,和数据库的表结构类似;
PUBLIC DATA 和 PRIVATE DATA:
- 就是你保存数据的地方,开发者可以查看所有的共享数据,但是只能看到自己的私密数据,无法看到用户的私密数据;这里没有显示PRIBATE DATA,其结构和PUBLIC DATA是一样的;
- User Records 记录一些当前使用者的信息;
- Default Zone :可以查看数据的详细信息;
ADMIN 主要是管理开发者团队权限的
新增模型:
存储数据的类型:
- NSData (single bytes)
- NSDate (date and time)
- NSNumber (both Int and Double)
- NSString (or String in Swift)
- NSArray (list)
- CKReference (used to create relationships between objects)
- CLLocation (location)
- CKAsset (file)
查询模型数据:
回到Default Zone,中间蓝色区域的右上角的名称旁有个倒三角,这里可以选择使用(查询)哪个模型下的数据:
保存图片字段选Asset类:
API使用
引入CloudKit.framework:
#import <CloudKit/CloudKit.h>
判断 iCloud 功能是否开启:
使用NSFileManager 的 URLForUbiquityContainerIdentifier方法
iCloud 容器路径
iCloud 容器和你 App 文件沙盒, 在 iOS 文件系统中其实是分别存放在两个不同的地方的:
- iCloud 文件路径格式 file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~xxx~aaa/Documents
- App 沙盒文件路径格式 file:///var/mobile/Containers/Data/Application/3B4376B3-89B5-3342-8057-3450D4224518/Documents/
操作数据
- 添加记录
- 保存图片
- 通过recordID 查找单条记录
- 查询多条记录
- 更新记录
- 删除记录
- 订阅推送
注:以上操作可以在demo中查看
CloudKit 基础对象类型
CKContainer:
Containers 就像应用运行的沙盒一样,一个应用只能访问自己沙盒中的内容而不能访问其他应用的。Containers 就是最外层容器,每个应用有且仅有一个属于自己的 container。(经过开发者授权配置 CloudKit Dashboard 之后,一个应用也可以访问其他应用的 container。)
CKDatabase:
Database 即数据库,私有数据库用来存储敏感信息,比如说用户的性别年龄等,用户只能访问自己的私有数据库。应用也有一个公开的数据库来存储公共信息
CKRecord:
即数据库中的一条数据记录。CloudKit 使用 record 通过 k/v 结构来存储结构化数据。关于键值存储,目前值的架构支持 NSString、NSNumber、NSData、NSDate、CLLocation,和 CKReference、CKAsset 以及存储以上数据类型的数组。
CKRecordZone:
Record 不是以零散的方式存在于 database 之中的,它们位于 record zones 里。每个应用都有一个 default record zone,你也可以有自定义的 record zone。
CKAsset:
即资源文件,例如二进制文件。
使用 NSOperation 的依赖来管理互相依赖的任务
CKFetchRecordsOperation *firstFetch = ...;
CKFetchRecordsOperation *secondFetch = ...;
[secondFetch addDependency:firstFetch];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperations:[firstFetch, secondFetch] waitUntilFinished: NO];
总结
- 使用简单,适用独立开发者或者小团队
- 局限性:依赖苹果的账号系统
- 可以持久保存部分文件,即使App卸载
- 其他平台:网站集成CloudKit JS、CloudKit web service 对CloudKit服务进行HTTP请求
进阶和补充
TODO:研究UIDocument相关API,文件备份
参考资料:
iOS项目iCloud及CloudKit Dashboard运用 http://www.cocoachina.com/ios/20161205/18285.html
CloudKit使用教程 http://www.jianshu.com/p/e2733b8d203f
使用 iCloud API 的正确姿势 http://www.cocoachina.com/ios/20160817/17382.html
iCloud开发入门 和一个demo:http://blog.csdn.net/swallow_baby/article/details/52494844
一个demo:iOS5新特性:iCloud代码示例(有图有马有注释才厚道) http://www.cocoachina.com/bbs/read.php?tid-77337.htm
http://www.cocoachina.com/ios/20111008/3322.html
一个同步,crash问题研究 http://www.cocoachina.com/bbs/read.php?tid=197917
NSPredicate http://nshipster.cn/nspredicate/
Demo
https://github.com/ychexingwuji/DM_iCloud