CloudKit 通知のサブスクリプションを作成しようとしていますが、述語を正しく取得できないようです。比較述語が 1 つだけ表示される単純な通知が表示されるため、ペイロードは正しく構成されていますが、述語をもう少し複雑にすると、通知を受け取りません。複数のレコード変更をサブスクライブする必要がありますが、1 つずつ実行する必要があります。私が望むのは、IN または OR を使用してサブスクリプションを 1 つだけ持つことができるようにすることですが、うまくいかないようです。
作業述語
let predicate = NSPredicate(format: "recordID == %@", recordID1)
機能しない述語
let recordIDs = [recordID1, recordID2, recordID3, recordID4]
let predicate1 = NSPredicate(format: "recordID IN %@", recordIDs)
let predicate2 = NSPredicate(format: "NOT recordID IN %@", recordIDs)
var predicate3 = NSPredicate(format: "recordID != %@", recordID1)
for id in recordIDs.filter {$0 != recordID1} {
predicate3 = NSCompoundPredicate(andPredicateWith: [predicate, NSPredicate(format: "recordID != %@", id)])
}
参照用に CKQuery CloudKit ガイド ( https://developer.apple.com/reference/cloudkit/ckquery ) を使用しています。サブスクリプションの述語の実装が異なるのでしょうか、それとも間違った述語を作成しているだけですか? ちなみに、すべての述語はコンパイルされ、ブレークポイントで正しく表示され、コードにエラーはなく、アプリはどの時点でもクラッシュしません。サブスクリプションが実際にサーバー上にあり、述語を使用していることを確認しました指定しました。レコードがデバイス上で変更された場合でもサーバー上で変更された場合でも、より複雑な述語はいずれにも一致しないようです。
完成させるために、最初の述語を使用して完全に機能する残りのサブスクリプション コードを次に示しますが、残りは使用しません。
let subscription = CKSubscription(recordType: "Avatar", predicate: predicate, options: CKSubscriptionOptions.FiresOnRecordUpdate)
let notificationInfo = CKNotificationInfo()
notificationInfo.shouldSendContentAvailable = true
subscription.notificationInfo = notificationInfo
どんな助けでも大歓迎です。