2016-10-07 5 views
2

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ダッシュボードに表示されます(トリガーINSERTUPDATE)。


更新:おそらく私の唯一のそれらの通知を発射する可能性があり、サブスクリプションと私の「更新」サブスクリプション「を作成」の間で異なることができるかを考えて、長い時間の後、私はそれだけで実現"更新" サブスクリプションはしなかった...

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:)」に相当しているかを確認するために失敗します"

+0

解決策は見つかりましたか? – Vasily

+0

実際にはありません。これはホビープロジェクトです。私は仕事以来忙しかったです。 –

答えて

1

ソリューションは、このように、shouldSendContentAvailable = trueで情報オブジェクトを使用するように表示されます。私のためにそれを解決した

let info = CKNotificationInfo() 
info.shouldSendContentAvailable = true 
subscription.notificationInfo = info 

。ユーザーに可視の通知が表示されずにdidReceiveRemoteNotification:が発生します。したがって、必要に応じてサイレント通知が表示され、実際には必要に応じて到着します。

私がsubscription.notificationInfoを残すと、アプリには変更が通知されません。しかし、[効果的にサイレント]情報オブジェクトでは、私は望ましい結果を得る。

関連する問題