CloudKitの基本を学ぶための簡単なメッセージングアプリケーションを開発しようとしています。CloudKitが更新通知を送信しない
レコードの更新イベントの通知を受け取ることができないことを除いて、ほとんどわかっています。
アプリをテストするには、デバイスとシミュレータで同時に実行しています。
両方のインスタンスが同じiCloudアカウントにログインしています(テスト用の専用アカウントを作成していない...)。しかし、アプリはローカルユーザをUUIdsを使用するリモートユーザと区別します。したがって、問題はありません。
アプリのあるインスタンスがメッセージを送信したいとき、レコードを作成してCloudKitに保存します。
私は、シミュレータではAPNがサポートされていないことを認識していますが、シミュレータからメッセージを送信すると、はに通知されます。
これは機能します。
次へは、私が「読み取り」としてメッセージをマークしたい。すなわち、彼らはそれらを最初に執筆ものではありませんデバイスに表示されているフラグそれら。
これは、対応するレコードをフェッチして変更し、保存することで行います。したがって、デバイスから送信されたメッセージがシミュレータに表示され、そこに「読み込み済み」としてフラグが立てられます。もう一方の端には、「更新」の通知を受信されることはありません、しかし
publicDatabase.perform(query, inZoneWith: nil, completionHandler: {(records, error) in
guard let records = records, records.count > 0 else {
return print("Error - Message: \(message.text) by \(message.userName) NOT found on the cloud!")
}
let record = records[0]
// HERE THE RECORD IS MODIFIED LOCALLY:
record["readTimestamp"] = (message.readTimestamp! as NSDate)
// Now, save it:
self.publicDatabase.save(record, completionHandler: {record, error in
guard error == nil else {
return print("Error - Message: \(message.text) by \(message.userName) could NOT be saved as read!")
}
print("Message: \(message.text) by \(message.userName) SAVED as read at \(message.readTimestamp!)")
})
})
:私はcloudKitでその変更を同期しては、デバイスが通知を受け取ることを期待しています。
両方のインスタンスがiCloudに同じユーザとしてログインしているためですか? 「作成」通知が問題なく配信されるため、これは信じがたいものです。
両方の通知の購読(「メッセージ作成」と「メッセージ更新」)が正常に登録され、CloudKitダッシュボードに表示されます(トリガーINSERT
とUPDATE
)。
更新:おそらく私の唯一のそれらの通知を発射する可能性があり、サブスクリプションと私の「更新」サブスクリプション「を作成」の間で異なることができるかを考えて、長い時間の後、私はそれだけで実現"更新" サブスクリプションはしなかった...
let subscription = CKQuerySubscription(recordType: "Message",
predicate: NSPredicate(value: true),
subscriptionID: Bundle.main.bundleIdentifier! + ".subscription.message.create",
options: .firesOnRecordCreation
)
let notificationInfo = CKNotificationInfo()
// THIS LINE MAKES ALL THE DIFFERENCE:
notificationInfo.alertBody = "You've Got Mail!"
subscription.notificationInfo = notificationInfo
publicDatabase.save(subscription, completionHandler: {savedSubscription, error in
: "作成" のサブスクリプションには、通知の体を持っていた
let notificationInfo = CKNotificationInfo()
subscription.notificationInfo = notificationInfo
アラート本体を追加すると、「更新」通知が到着し始めました。
ただし、これは回避策に過ぎません。私はのサイレントの更新情報を読む必要があります。彼のメッセージが相手側で読み取られたことをユーザーに警告するためだけにバナーを表示するのは意味がありません。 また、CloudKitプログラミングガイドではこの制限について言及していません。
サイレント(つまり空の)プッシュ通知を購読する方法はありますか?
アップデート2:実は、私はAPI ReferenceCKNotificationInfo
のために、このビットが見つかりました:
注意を
あなたが
alertBody
のいずれかを設定しない場合、soundName
、またはshouldBadge
のプロパティの場合、プッシュ通知は優先度が低くなりますその がユーザーに警告することはありません。
(強調鉱山)
私はまだ、この「システムは、ユーザに警告することはありません低い優先順位は、」すべてので呼び出されていないapplication(:didReceiveRemoteNotification:fetchCompletionHandler:)
」に相当しているかを確認するために失敗します"
解決策は見つかりましたか? – Vasily
実際にはありません。これはホビープロジェクトです。私は仕事以来忙しかったです。 –