パブリック CloudKit データベースでサブスクリプションを作成する際に問題が発生しています。最初の iCloud ユーザーのサブスクリプションを保存する場合、コードは正常に機能しますが、2 番目の iCloud ユーザーの同じレコード タイプに対してわずかに異なるサブスクリプションを保存しようとすると失敗します。
サブスクリプションを保存するコードは次のとおりです (Swift での回答も問題ありません)。
CKNotificationInfo *info = [[CKNotificationInfo alloc] init];
info.shouldSendContentAvailable = YES;
CKReference *ref = [[CKReference alloc] initWithRecordID:_ckUserID action:CKReferenceActionNone];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"user == %@", ref];
NSString *subId = [NSString stringWithFormat:@"access-%@", _ckUserID.recordName];
CKSubscription *sub = [[CKSubscription alloc] initWithRecordType:@"access" predicate:pred subscriptionID:subId options:CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate | CKSubscriptionOptionsFiresOnRecordDeletion];
sub.zoneID = [CKRecordZone defaultRecordZone].zoneID;
sub.notificationInfo = info;
CKModifySubscriptionsOperation *op = [[CKModifySubscriptionsOperation alloc] initWithSubscriptionsToSave:@[ sub ] subscriptionIDsToDelete:nil];
op.modifySubscriptionsCompletionBlock = ^(NSArray<CKSubscription *> *savedSubscriptions, NSArray<NSString *> *deletedSubscriptionIDs, NSError *operationError) {
if (operationError) {
RMLogError(@"Error trying to update user's access subscription: %@", operationError);
} else {
RMLogInfo(@"User access subscription added");
}
};
[_ckdatabase addOperation:op];
_ckUserID
CKRecordID
現在の iCloud ユーザーを表す です。現在の CloudKit コンテナーのパブリック データベースへの参照です
_ckdatbase
。CKDatabase
このコードがユーザー A のデバイス A で実行されると、サブスクリプションは問題なく保存されます。
次に、このコードをデバイス B でユーザー B を使用して実行すると、ログに次のメッセージが表示されてサブスクリプションが失敗します。
2016-04-19 11:38:42:504 MyApp[560:f03] ユーザーのアクセス サブスクリプションの更新中にエラーが発生しました: <CKError 0x147830530: "Partial Failure" (2/1011); "一部のサブスクリプションを変更できませんでした"; uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1; コンテナー ID = "iCloud.com.blah.MyApp"; 部分的なエラー: { access-_df09e8908eeb9b9f12ebbe935e389d51 = <CKError 0x14664b4e0: "不明なアイテム" (11/2003); サーバー メッセージ = "必要なレコード タイプが見つかりませんでした: _sub_trigger_sub_08b399dc1448e58993a967b704a07ee0"> }>
access
レコード タイプには、iCloud ユーザー ID を表す CKRecordID への参照であるフィールドuser
があります。
ここでの私の目標は、現在のユーザーに固有のレコードがこのテーブルに追加、更新、または削除されるたびにアプリが認識できるようにする、各ユーザーのサブスクリプションを持つことです。
このレコード タイプの 2 番目のユーザーからの 2 番目のサブスクリプションを保存できないのはなぜですか? ユーザーIDに基づいて、各サブスクリプションに独自の一意のIDも与えています。