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 功能。
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) CKRecordCKDatabase 直接從 擷取 ,而不參考區域。 預設值 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;
}