パブリックCloudKitデータベースにサブスクリプションを作成する際に問題が発生しました。最初のiCloudユーザーのサブスクリプションを保存するとコードは正常に動作しますが、2番目のiCloudユーザーの同じレコードタイプに対してわずかに異なるサブスクリプションを保存しようとしても失敗します。ここで iCloudの各ユーザーは、CloudKitでユーザー固有のサブスクリプションをどのように保存できますか?
は、サブスクリプションを節約するコードです(スウィフトで回答が細かすぎる):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
は、現在のiCloudユーザーを表すCKRecordID
です。
_ckdatbase
は、現在のCloudKitコンテナのパブリックデータベースへの参照であるCKDatabase
です。
このコードをユーザーAを使用してデバイスAで実行すると、サブスクリプションは正常に保存されます。
2016年4月19日11:38:42:504のMyApp [560
このコードは次いで、ユーザBとデバイスB上で実行される
は、サブスクリプションログに次のメッセージで失敗します。 f03]ユーザーのアクセスサブスクリプションの更新中にエラーが発生しました。< CKError 0x147830530:「部分的な失敗」(2/1011)。 "一部のサブスクリプションの変更に失敗しました"; uuid = 98E9F99A-C4F6-4488-8087-45285A7C1DB1;コンテナID = "iCloud.com.blah.MyApp";部分的なエラー:{ アクセス-df09e8908eeb9b9f12ebbe935e389d51 = < CKError 0x14664b4e0: "不明な項目"(11/2003);サーバ・メッセージ=「必要なレコードタイプが見つかりませんでした:_sub_trigger_sub_08b399dc1448e58993a967b704a07ee0を」> }>
access
レコードタイプのiCloudユーザIDを表すCKRecordIDへの参照であるuser
フィールドを有しています。
私の目標は、現在のユーザーに固有のレコードがこのテーブルから追加、更新、または削除されるたびにアプリが知ることを可能にする、各ユーザーのサブスクリプションを持つことです。
2番目のサブスクリプションをこのレコードタイプに対して保存できないのはなぜですか?私は各サブスクリプションにユーザIDに基づいて独自のIDを与えています。
どちらのデバイスもCloudKit開発環境を使用していますか? 1台のデバイスが本番環境を使用することを決定し、レコードタイプなどを本番環境に展開していない可能性はありますか? –
どちらも同じ開発データベースを使用しています。両方とも同じデータを参照します。 – rmaddy