2016-04-19 11 views
9

パブリック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を与えています。

+0

どちらのデバイスもCloudKit開発環境を使用していますか? 1台のデバイスが本番環境を使用することを決定し、レコードタイプなどを本番環境に展開していない可能性はありますか? –

+0

どちらも同じ開発データベースを使用しています。両方とも同じデータを参照します。 – rmaddy

答えて

4

私はこの問題を再現するために簡単なテストアプリケーションを作成しましたが、もちろんテストアプリケーションで正常に機能しました。

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

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

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

関連する問題