9

パブリック 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];

_ckUserIDCKRecordID現在の iCloud ユーザーを表す です。現在の CloudKit コンテナーのパブリック データベースへの参照です
_ckdatbaseCKDatabase

このコードがユーザー 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も与えています。

4

1 に答える 1

4

この問題を再現するための簡単なテスト アプリを作成しました。もちろん、テスト アプリでは問題なく動作しました。

私は実際のアプリに戻り、掘り下げた後、この問題を解決しました。私は2つのことをしました:

  1. CloudKit ダッシュボードで、既存のサブスクリプション タイプをすべて削除しました。
  2. 誤ってサブスクリプションを に設定していたコードのバグを修正しzoneIDましたdefaultRecordZone。投稿された問題とはあまり関係ありませんが、このバグは、デバイスがレコードの追加/更新/削除に使用されたのと同じ iCloud アカウントにログインしていない限り、通知がデバイスに届かないようにしていました。

基本的に、これは奇妙なエラーで、ダッシュボードの一部をリセットしてアプリを再起動することで修正されました。

于 2016-04-24T03:18:21.937 に答える