4

ユーザーへの CKReference を持つフィールドを含むレコードの CKSubscription をセットアップしようとしています。ただし、レコードが作成されるたびに、compoundPredicate のこの部分が無視され、通知は送信されません。CKSubscription の述語で CKReference を使用することについて何か違いはありますか? ダッシュボードに移動して、(シミュレーターで別のユーザーを実行しているときに) 自分のユーザー recordID の下に新しいレコードを入力します。これは、レコードがデバイスからのものである場合、通知を受信しないことを読んだためです。私はこれに1週間立ち往生しており、これに固有のものをオンラインで見つけることができないため、洞察をいただければ幸いです。真の型の述語の通知を受け取ることができるので、基本的な設定は問題ないと思います。

ダッシュボードには、両方のテスト ユーザーに対して 1 つの汎用サブスクリプションが表示されますが、どちらのユーザーにも特定のレコード ID は表示されません (これは問題ですか?)。

Notifications.read (equals string)
Notifications.user (equals reference)

fetchAllSubscriptionsWithCompletionHandler メソッドを実行すると、このデバイスの現在のユーザー固有の recordID がデバッガーの CKReference として表示されます。だから、なぜうまくいかないのかわからない。

最初に CKReference を作成し、それを述語に使用するコードは次のとおりです。

var recordIDString = CKRecordID(recordName: "_a86dac8ee05f8c6ab35746bf9663d7b8")
// I normally store this string in the NSUserDefaults.

    let userRef = CKReference(recordID: recordIDString, action: .DeleteSelf)
     let predicate = NSPredicate(format: "user = %@", userRef)
   let predicateTwo = NSPredicate(format: "read = %@", "")
// I want the read field to be empty, which tells me user has not read my internal app notif.
  let compoundPred = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [predicate, predicateTwo])


Now I set-up the subscription like this:

let subscription = CKSubscription(recordType: "Notifications",
        predicate: compoundPred,
        options: .FiresOnRecordCreation)

    let notificationInfo = CKNotificationInfo()

    notificationInfo.alertBody = "Someone replied to your post"
    notificationInfo.shouldBadge = true

    subscription.notificationInfo = notificationInfo

    publicDB.saveSubscription(subscription,
        completionHandler: ({subscription, error in.....etc})
      // handling this part
4

2 に答える 2

5

私はこれと同じ問題を抱えていて、りんごのウェブサイトで次の情報に出くわしました。

述語に CKReference フィールドが含まれるサブスクリプションを作成する場合は、述語を作成するときにフィールドの値として CKRecordID オブジェクトを使用してください。この場合の CKRecord オブジェクトの使用は、現在のところ機能しません。

CKQuerySubscription の述語を変更して、CKReference の代わりに CKRecordID を使用すると、期待どおりに機能しました。これが古いスレッドであることは認識していますが、CKQuery と CKQuerySubscription の間で述語の動作が異なるように見えるため、この問題に対する答えを見つけるのに苦労しました。

于 2017-02-03T04:45:22.203 に答える
1

NSPredicateの代わりにサブスクリプションを初期化しますNSCompoundPredicate

let predicate = NSPredicate(format: "user = %@ AND read = %@",
    argumentArray: [userRef, ""])
let subscription = CKSubscription(recordType: "Notifications",
    predicate: predicate,
    options: .FiresOnRecordCreation)

CloudKit での私の経験では、これでうまくいくはずです。

于 2015-05-13T20:58:34.187 に答える