1

親レコードへの参照フィールドに基づいて、子レコードの変更のサブスクリプションを作成しました。

子レコードを作成し、その子の親参照をCKReferenceActionNone参照で設定すると、サブスクリプションでプッシュ通知が生成されません。CKReferenceActionDeleteSelf参照を使用すると、サブスクリプションは期待どおりに機能し、サブスクライブしているすべてのデバイスでプッシュ通知が生成されます。

カスケード削除はしたくありません。プッシュ通知を生成するためにCKReferenceActionDeleteSelf参照を使用する必要があるのはなぜですか?

コードは次のとおりです。

// subscription registration
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"parent_ref", _parentRecordID];
CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:@"Child"
                                                                predicate:predicate
                                                                  options: CKSubscriptionOptionsFiresOnRecordCreation|CKSubscriptionOptionsFiresOnRecordUpdate|CKSubscriptionOptionsFiresOnRecordDeletion];
CKNotificationInfo *notificationInfo = [[CKNotificationInfo alloc] init];
notificationInfo.alertBody = @"Alert body";
notificationInfo.shouldBadge = YES;
notificationInfo.shouldSendContentAvailable = YES;
subscription.notificationInfo = notificationInfo;
[_db saveSubscription:subscription 
    completionHandler:^(CKSubscription *subscription, NSError *error) {
        // completes without error
}];

...

// child record construction
CKReference *parentRef = [[CKReference alloc] initWithRecordID:_parentRecordID 
                                                        action:CKReferenceActionNone];
CKRecord *childRecord = [[CKRecord alloc] initWithRecordType:@"Child"];
childRecord[@"parent_ref"] = parentRef;
[_db saveRecord:childRecord completionHandler:^(CKRecord *record, NSError *error) {
    // completes without error, but does NOT generate a push notification.
    // HOWEVER, if parentRef.action is CKReferenceActionDeleteSelf instead of 
    //      CKReferenceActionNone, then push notifications fire on other devices, 
    //      as expected.
}];

-saveRecord: はエラーなしで完了しますが、プッシュ通知は生成しません。ただし、parentRef.action が CKReferenceActionNone ではなく CKReferenceActionDeleteSelf である場合、予想どおり、他のデバイスでプッシュ通知が発生します。

これはなぜでしょうか?

4

0 に答える 0