3

数週間にわたって CKSubscription 機能について読み、使用しようとしましたが、一般的な質問に関する情報が見つかりません。Apple のドキュメント、オンライン チュートリアル、購入した本、SO に関する質問を読みましたが、基本的なことはまだ理解できていません。どんな助けでも大歓迎です。

答えが見つからない質問は次のとおりです。

1)。サブスクリプション ID の目的は何ですか? 便利なinitにはそれが含まれていないのに、なぜ指定されたinitに必要なのですか? 使用する場合、アプリのすべてのユーザーに対して同じですか?

2)。ここで、subscriptionID の登録を解除できると誰かが言及しているのを見ました。なぜ、またはどのようにこれを行うのですか?

3)。パブリック データベースとユーザーのプライベート データベースの両方でサブスクリプションを設定できますか?

4)。すべてのユーザーに同じクエリ ベースのサブスクリプションがある場合、データベースに一覧表示されるサブスクリプションは 1 つだけになりますか?

たとえば、特定のユース ケースで通知を受け取るのに問題があります。True述語を機能させることができ、通知が来るので、私のセットアップでは問題ありません。したがって、サブスクリプションがどのように機能するかの基本をまだ理解してはいけません。

別のユーザーが投稿にコメントしたときに新しいレコードが作成されるたびに起動するサブスクリプションをセットアップしようとしています。この新しいレコードには、投稿を作成したユーザーへの参照が含まれます。両方のユーザーのデータベースに表示される唯一のサブスクリプションは、Notifications.user (equals 参照) です。したがって、このサブスクリプションは 1 つしか表示されないと思います (?)。しかし、サーバーはどのようにしてすべてのユーザーのレコード ID を追跡したり、特定のデバイスに送信するタイミングを認識したりするのでしょうか?

問題は、通知が機能しないことです。ダッシュボードにレコードを手動で追加し、他のユーザーのレコード ID を CKReference に設定します。レコードを追加している間、フィールドに CKReference として追加したユーザーのアカウントの下で、デバイスのバックグラウンドでアプリを実行しています。誰かがこのユーザーの投稿にコメントしたため、クエリがトリガーされてプッシュ通知が送信されることを期待しています。

サブスクリプションをセットアップするための私のコードは次のとおりです。

func subscribe(userID: CKRecordID) {


    let options = CKSubscriptionOptions.FiresOnRecordCreation

    let userRef = CKReference(recordID: userID, action: .DeleteSelf)
    let predicate = NSPredicate(format: "userRef == %@", userRef)
    let predicateTwo = NSPredicate(format: "read = %@", "")
    let compoundPred = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [predicate, predicateTwo])

    let subscription = CKSubscription(recordType: "Notifications", predicate: compoundPred, subscriptionID: subscriptionID,
        options: options)
    subscription.notificationInfo = CKNotificationInfo()
    subscription.notificationInfo.desiredKeys = ["userPost"]
    subscription.notificationInfo.alertBody = "Someone replied to your Pod post"

    publicDB.saveSubscription(subscription, completionHandler: {

        subscription, error in

        if (error != nil) {

            println("error subscribing: \(error)")

        } else {

            println("subscribed!")

        }

    })
}
4

1 に答える 1