什么是 CloudKit?
CloudKit 提供 API 訪問(wèn) iCloud 服務(wù)器;使用用戶的 iCloud 賬戶來(lái)創(chuàng)建一個(gè)用戶,并且擁有可供每個(gè)用戶訪問(wèn)的公開(kāi)權(quán)限的數(shù)據(jù)庫(kù),以及每個(gè)用戶自己的私有數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)信息;也可以通過(guò) CloudKit 的文件存儲(chǔ)系統(tǒng)來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)和大文件;這一切都不僅僅發(fā)生在用戶本地,數(shù)據(jù)被存儲(chǔ)在云端,用戶可以在任意其它設(shè)備上訪問(wèn)??偟膩?lái)說(shuō),CloudKit 是數(shù)據(jù)庫(kù)、文件存儲(chǔ)、用戶認(rèn)證系統(tǒng)的集合服務(wù)。
開(kāi)啟 CloudKit
在 Xcode 的項(xiàng)目設(shè)置界面打開(kāi) iCloud 開(kāi)關(guān)并勾選 CloudKit 就可以了:

CloudKit 基礎(chǔ)對(duì)象類型
CloudKit 的基礎(chǔ)對(duì)象類型有 7 種。
CKContainer: Containers 就像應(yīng)用運(yùn)行的沙盒一樣,一個(gè)應(yīng)用只能訪問(wèn)自己沙盒中的內(nèi)容而不能訪問(wèn)其他應(yīng)用的。Containers 就是最外層容器,每個(gè)應(yīng)用有且僅有一個(gè)屬于自己的 container。(事實(shí)上,經(jīng)過(guò)開(kāi)發(fā)者授權(quán)配置 CloudKit Dashboard 之后,一個(gè)應(yīng)用也可以訪問(wèn)其他應(yīng)用的 container。)
CKDatabase: Database 即數(shù)據(jù)庫(kù),私有數(shù)據(jù)庫(kù)用來(lái)存儲(chǔ)敏感信息,用戶只能訪問(wèn)自己的私有數(shù)據(jù)庫(kù)。公開(kāi)的數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)公共信息,公共數(shù)據(jù)庫(kù)所有用戶都能訪問(wèn)。
CKRecord: 即數(shù)據(jù)庫(kù)中的一條數(shù)據(jù)記錄。CloudKit 使用 record 通過(guò) k/v 結(jié)構(gòu)來(lái)存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。關(guān)于鍵值存儲(chǔ),目前值的架構(gòu)支持 NSString、NSNumber、NSData、NSDate、CLLocation,和 CKReference、CKAsset,以及存儲(chǔ)以上數(shù)據(jù)類型的數(shù)組。
CKRecordZone: Record 不是以零散的方式存在于 database 之中的,它們位于 record zones 里。每個(gè)應(yīng)用都有一個(gè) default record zone,也可以有自定義的 record zone。
CKRecordIdentifier: 是一條 record 的唯一標(biāo)識(shí),用于確定該 record 在數(shù)據(jù)庫(kù)中的唯一位置。
CKReference: Reference 很像 RDBMS 中的引用關(guān)系。以地理位置簽到應(yīng)用為例,每個(gè)地理位置可以包含很多用戶在該位置的簽到,那么位置與簽到之間就形成了這樣一種包含式的從屬關(guān)系。
CKAsset: 即資源文件,例如二進(jìn)制文件。還是以簽到應(yīng)用為例,用戶簽到時(shí)可能還包含一張照片,那么這張照片就會(huì)以 asset 形式存儲(chǔ)起來(lái)。
Convenience API
Convenience API 顧名思義是對(duì) CloudKit 操作的便利 API。利用 Convenience API 就可以對(duì) record 進(jìn)行數(shù)據(jù)的三種基本操作:存儲(chǔ)、讀取、更改。

因?yàn)?CloudKit 在異步運(yùn)行saveRecord:completionHandler:時(shí)會(huì)使用網(wǎng)絡(luò)與服務(wù)器交互,網(wǎng)絡(luò)狀況是不定的,所以一定記得要在 block 中處理錯(cuò)誤,一個(gè)好的應(yīng)用應(yīng)當(dāng)有完善的錯(cuò)誤處理機(jī)制。
你需要檢查NSError對(duì)象來(lái)確定正在處理哪種錯(cuò)誤。例如,無(wú)網(wǎng)絡(luò)線連接的時(shí)候會(huì)觸發(fā)CKErrorNetworkUnavailable類型的錯(cuò)誤,然后你需要做的就是失敗后重試。

更改已存在記錄非常簡(jiǎn)單,只需要將其獲取、更改、保存即可。這里你需要關(guān)心的是如何作者三個(gè)步驟,特別是當(dāng)依賴其他 record 來(lái)更新一個(gè) record 的時(shí)候。
一個(gè)更好的解決辦法是,使用NSOperation的依賴來(lái)管理互相依賴的任務(wù):

有了這些便利的 API,相信你可以做大部分你想做的工作了。這比起寫(xiě)后端代碼、租用服務(wù)器、部署維護(hù),然后再寫(xiě)客戶端代碼去和服務(wù)端交換信息要簡(jiǎn)單多了。
查詢

遠(yuǎn)不止如此...
正如我們開(kāi)始所提到的,CloudKit 能做的還遠(yuǎn)不止如此。你可以為簽到附上圖片;對(duì) Checkin 和 Place 之間建立 reference 關(guān)聯(lián)以便能夠查詢某個(gè)地點(diǎn)下的所有簽到;甚至,CloudKit 還提供了 API 供你非常方便地查詢你通訊錄中的好友還有誰(shuí)也在玩這個(gè)應(yīng)用......
目前蘋(píng)果允許你使用 CloudKit 存儲(chǔ) 10 GB 資源,100 M 數(shù)據(jù)庫(kù)存儲(chǔ),每天 2 GB 流量;當(dāng)你的用戶數(shù)量增加的時(shí)候,這些免費(fèi)額度也相應(yīng)地增加到 1 PB 存儲(chǔ)、10 TB 數(shù)據(jù)庫(kù)存儲(chǔ),以及每天 200 TB 流量。
參見(jiàn)CloudKit cost calculator頁(yè)面底部來(lái)了解詳細(xì)的免費(fèi)額度和收費(fèi)標(biāo)準(zhǔn)。
WWDC 2015 中提到,CloudKit 已經(jīng)不僅可以在 iOS 和 OS X 上使用,可以在你的網(wǎng)站上集成CloudKit JS,以便 iCloud 用戶可以在瀏覽器中也能使用相應(yīng)的功能,或者是使用CloudKit web service對(duì) CloudKit 服務(wù)端直接進(jìn)行 HTTP 請(qǐng)求。這意味著,現(xiàn)在其他移動(dòng)或桌面平臺(tái)都可以使用 CloudKit 了!