CloudKit 命名空间
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
CloudKit 命名空间提供对 iCloud 的访问权限。
类
接口
ICKRecordValue |
表示所需方法的接口 ((如果协议 CKRecordValue有任何) )。 |
枚举
CKAccountStatus |
枚举指示用户的 iCloud 帐户是否可用的值。 |
CKApplicationPermissions |
枚举一个值,该值指示其他应用用户可以通过电子邮件地址发现当前用户。 |
CKApplicationPermissionStatus |
枚举应用程序在尝试获取权限时可能具有的状态。 |
CKDatabaseScope |
枚举值,该值指示数据库是专用的、共享的还是公共的。 |
CKErrorCode |
枚举 CloudKit 错误条件。 |
CKNotificationType |
枚举可以生成推送通知的事件。 |
CKOperationGroupTransferSize |
CloudKit 命名空间提供对 iCloud 的访问权限。 |
CKQueryNotificationReason |
枚举可以触发数据生命周期通知的持久性存储事件。 |
CKQuerySubscriptionOptions |
枚举触发通知的时间 CKSubscription 。 |
CKRecordSavePolicy |
枚举控制何时或是否应保存记录的策略。 |
CKRecordZoneCapabilities |
枚举区域能够执行的特殊操作。 |
CKReferenceAction |
枚举值,这些值控制引用在删除其目标记录时是否应删除自身。 |
CKShareParticipantAcceptanceStatus |
枚举共享参与请求的响应。 |
CKShareParticipantPermission |
枚举用户共享权限。 |
CKShareParticipantRole |
CloudKit 命名空间提供对 iCloud 的访问权限。 |
CKShareParticipantType |
枚举共享参与者类型。 |
CKSubscriptionOptions |
枚举用于控制基于查询的订阅的推送通知行为的标志。 |
CKSubscriptionType |
枚举订阅类型。 |
委托
注解
CloudKit 命名空间允许应用程序开发人员控制其应用程序和 iCloud 之间的数据流。 iCloud 提供服务器端数据存储,既在应用程序或特定应用程序的所有实例之间共享的“公共”,也提供单个用户独有的“专用”存储。 iCloud 存储和传输在 Apple 设备之间加密和同步。 CloudKit 不提供客户端持久性或数据缓存 - CloudKit 功能仅在用户具有活动的 Internet 连接时可用。
CloudKit 中最高级别的类是 CKContainer。 CloudKit 容器 (有时在 Apple 文档中称为“Ubiquity 容器”) 是使用特定名称标识的信息存储。 Apple 建议使用“iCloud”格式的名称。{reverse DNS}。{appName}“,例如”iCloud.com.mycompany.MyApp”。 开发人员必须使用 iCloud 仪表板创建和配置其容器,该仪表板可通过 Apple 开发人员门户获取。
单个 CKContainer 可以包含公共数据(在应用的所有实例之间共享 (查看 PublicCloudDatabase) )和私有数据(包含用户特定的数据 (查看 PrivateCloudDatabase) )。 在 iCloud 中,公共数据存储在应用的 iCloud 存储中,而专用数据存储在用户的专用 iCloud 存储中。 该应用的所有已连接用户(无论是否已登录到 iCloud)均可供公众 CKDatabase 使用。 仅当用户登录到 iCloud 时,才为专用 CKDatabase 。 开发人员必须编写其代码,以便对用户的登录或连接状态更改做出正常反应。
这些公共和私有 CKDatabase 对象存储结构化记录。 这些由 CKRecord 对象表示。 除了类似于字段的键值数据之外,这些记录还可以保存 CKAsset 大型对象,这些对象可以直接 (包含 CKRecord) 检索,也可以作为引用 (允许延迟检索大型数据) 。
所有 CKRecord 实例都存储在 中 CKRecordZone。 CKRecordZone与传统的数据库实例类似:它可以包含多个CKRecord存储,这些存储可以相互引用,但不能引用其他CKRecordZone实例中的存储,对象CKRecordZone可用于跨多个CKRecord存储协调原子操作。 与数据库实例的相似性不是通用的;例如,开发人员可以使用 M:CKDatabase.FetchRecordAsync (CKRecordID) 直接从 CKDatabase 中检索 CKRecord ,而无需引用区域。 默认值 CKRecordZone 通过 P:CloudKit.CKRecordZone.DefaultRecordZone () 提供。 开发人员可以使用 CloudKit 仪表板创建其他区域,并使用它们以逻辑方式对数据进行分区。
CloudKit 应用需要具有 com.apple.developer.icloud-services
权利和特定于应用的捆绑标识符 (预配配置文件,例如“com.mycompany.CloudKitApp”) 。 开发人员必须创建和配置此类预配配置文件。
下面演示了处理单个记录的 CloudKit 的一些典型用法:
//Create
private async Task<CKRecord> StoreInCloudKit (string name, CLLocation loc, int stationId)
{
string containerName = "iCloud.com.xamarin.CKWork";
var container = CKContainer.FromIdentifier (containerName);
CKDatabase publicDatabase = container.PublicCloudDatabase;
var zoneId = CKRecordZone.DefaultRecordZone ().ZoneId;
var recordType = "StationReferences";
var record = new CKRecord (recordType);
record ["Name"] = new NSString (name);
record ["Position"] = loc;
record ["StationID"] = new NSNumber (stationId);
var storedRecord = await publicDatabase.SaveRecordAsync (record);
return storedRecord;
}
//Retrieve (via ID)
private async Task<CKRecord> AccessCloudKit ()
{
string containerName = "iCloud.com.xamarin.CKWork";
var container = CKContainer.FromIdentifier (containerName);
CKDatabase publicDatabase = container.PublicCloudDatabase;
var recordNameIHappenToKnow = "7eaf0432-2fa4-475f-851a-c6a19b3f8587";
var recordId = new CKRecordID (recordNameIHappenToKnow);
var record = await publicDatabase.FetchRecordAsync (recordId);
return record;
}
//Retrieve (query)
private async Task<CKRecord []> QueryCloudKit ()
{
string containerName = "iCloud.com.xamarin.CKWork";
var container = CKContainer.FromIdentifier (containerName);
CKDatabase publicDatabase = container.PublicCloudDatabase;
var zoneId = CKRecordZone.DefaultRecordZone ().ZoneId;
Console.WriteLine ($"Default zone name = '{zoneId.ZoneName}' owner = '{zoneId.OwnerName}'");
/*
var zoneName = "_defaultZone";
var ownerName = "__defaultOwner__";
var zoneId0 = new CKRecordZoneID (zoneName, ownerName);
Console.WriteLine ($"Assert { zoneId0 == zoneId }");
*/
var recordType = "StationReferences";
var location = new CLLocation (19.7303, -155.056);
var predicate = NSPredicate.FromFormat ("distanceToLocation:fromLocation:(Position, %@) < 100", location);
var query = new CKQuery (recordType, predicate);
var result = await publicDatabase.PerformQueryAsync (query, zoneId);
return result;
}
//Update
private async Task<CKRecord> UpdateInCloudKit (CKDatabase database, CKRecord record, NSString key, NSObject newValue)
{
record [key] = newValue;
var modifiedRecord = await database.SaveRecordAsync (record);
return modifiedRecord;
}
//Delete
private async Task<CKRecordID> DeleteRecord (CKDatabase database, CKRecord record)
{
var id = record.Id;
var deletedId = await database.DeleteRecordAsync (id);
return deletedId;
}