iCloud帐户

iCloud帐户是CloudKit的骨干。除了浏览公共数据(稍后将进行讨论)外,您所做的任何事情都需要登录帐户。这给我们带来的好处是无需开发我们自己的身份验证层即可访问数亿用户。此外,iCloud帐户和CloudKit可以无缝地一起工作,因此,如果最终用户已经登录到其iCloud帐户,则不会要求他们登录到该应用程序。他们可以开始使用它并创建记录。

Containers

与大多数Apple技术一样,CloudKit围绕Containers的概念发展。Containers容器为应用程序的唯一标识提供了一种方法。使用CloudKit,您始终拥有一个默认Containers容器;此外,您的应用可以访问您有权访问的其他容器。能够访问其他容器使应用程序之间可以共享数据。默认容器是
与包标识符相同。重要的是要记住,一旦有了CloudKit容器
创建后就无法删除,因此请确保您的捆绑包标识符是您计划永久使用的标识符。容器在所有开发人员中必须唯一。学习CloudKit时的一个好习惯是选择一个将用于所有测试应用程序的标识符。然后,每当您想要使用该标识符创建新应用时,都可以通过CloudKit仪表板重置开发环境。 (我们将在稍后介绍。)
将容器视为只有您的应用可以访问的沙箱。每个使用CloudKit的应用程序都有自己的沙箱。这样可以防止应用覆盖彼此的数据,并确保您的数据安全并确保其他开发人员永远无法访问它们。
容器作为CKContainer公开:

let container = CKContainer.defaultContainer()

Database

CloudKit为我们提供了对两个不同数据库的访问权,每个客户端应用程序都可以访问的公共数据库,以及仅用于访问CloudKit的帐户可以访问的私有数据库。重要的是要记住,我们作为开发人员无法访问最终用户的私有数据库。公共数据库资源成本由开发人员的支付,而私有数据库资源成本与由用户的支付。
对于公共类应用程序,我们会将数据存储在公共数据库中,以便其他用户可以查看它。

数据库公开为CKDatabase。您可以通过CKContainer访问数据库:

let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
let privateDatabase = CKContainer.defaultContainer().privateCloudDatabase

您可以在CloudKit仪表板中为公共数据库创建访问角色和权限。

Records

记录
CKRecord是包装键-值对的结构数据,其中每个值都有一个记录类型。开发人员模式下的记录使用即时模式。当您进入生产环境时,数据不会被用作即时数据。这意味着在开发应用程序时,您可以根据需要任意更改数据结构。但是,一旦您的应用程序移至生产数据库中,您将无法再更改数据结构。
支持的记录类型为NSString,NSNumber,NSData,NSDate,CLLocation,CKReference,CKAsset;记录也可以是数组,而不是单个记录类型:

let park = CKRecord(recordType: "Park")
// Setting values
park.setObject("Lafarge Lake", forKey: "name") park["location"] = "Vancouver, BC"
// Accessing values
var name = park.objectForKey("name") 
var location = park["location"]

Record Zones

记录在记录区域内分组。可以有多个记录区。每个容器都有一个默认的记录区。

Record Identifiers

CKRecordID包含recordName和CKRecordZoneID。如果您不提供CKRecordZoneID,则默认记录区将被使用。如果您不提供recordName,则会为您创建一个默认名称。

References

CKReference允许您将CKRecord相互关联。创建引用时,应使用反向引用。

Assets

CKAsets用于存储大文件,例如图像或视频,并存储为大容量存储。 CloudKit会为您有效地上传和下载资产。资产由CKRecords拥有,并作为磁盘上的文件传输。

let photoURL = NSURL(fileURLWithPath: "...") let parkThumbnail = CKAsset(fileURL: photoURL) park["thumbnail"] = parkThumbnail

Convenience API

您可以在公共或私有数据库上使用带有带有completeHandler调用的saveRecord来保存记录。这是一个异步方法调用,因此请合理优雅处理数据。

1、保存数据

// Create a record ID or allow CloudKit to create a
// random one for you.
let recordID = CKRecordID(recordName: "vanLostParkID")
// Create a new record using the RecordID if created
let park = CKRecord(recordType: "Park", recordID: recordID) // Choose either the public or private database where you // want to save the record
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
// Use the convience API saveRecord with completionHandler publicDatabase.saveRecord(park) { (savedPark: CKRecord?, error: NSError?) -> Void in
// Handle any errors when error != nil }

2、获取数据

// Fetching a record from CloudKit
// Use a predetermined CKRecordID
let recordID = CKRecordID(recordName: "vanLostParkID") // Choose either the public or private database where // you want to save the record
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
// Use the convenience API fetchRecordWithID
// and completionHandler
publicDatabase.fetchRecordWithID(recordID) { (park: CKRecord?, error: NSError?) -> Void in
// Handle any errors when error != nil }

3、查询、修改、保存数据到CloudKit

// Fetching a record from CloudKit
// Use a predetermined CKRecordID
let recordID = CKRecordID(recordName: "vanLostParkID")
// Choose either the public or private database
// where you want to save the record
let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
// Use the convenience API fetchRecordWithID
// and completionHandler
publicDatabase.fetchRecordWithID(recordID) { (fetchedPark: CKRecord?, error: NSError?) -> Void in
// Handle any errors when error != nil if error != nil {} else {
// Modify the fetched park
fetchedPark!["name"] = "Updated Park Name"
// Save the modified park back to CloudKit publicDatabase.saveRecord(fetchedPark!, completionHandler: { (savedPark: CKRecord?, error: NSError?) -> Void in
// Handle any errors when error != nil })
} }

推荐

基础文章推荐

经典教程推荐

技术源码推荐

推荐文章

CoreData篇

Combine篇

TextField篇

JSON文件篇


一篇文章系列

技术交流

QQ:3365059189
SwiftUI技术交流QQ群:518696470

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐