2013-06-04 8 views
9

にGCM通知を送信します。は、オフラインデバイス

私の質問は:

GCMサーバはキューにこれらの通知を維持し、自動的にデバイスがオンラインのときに再送信しますか?またはそれは私によって完全に処理されなければなりません。

GCMサーバが自動的に(デバイスがオンラインになった後に)自動的に送信する場合、実際に通知を送信するまで、私のサーバはすでに送信済みであるとみなします。通知が正常に再送信された時刻を追跡するにはどうすればよいですか?

通知は、Unavailable error messageを参照して送信されたものではなく、GCMが正常に通知を送信すると送信済みとしてマークする方法を確認できないことをサーバー側にマークすることがあります。

がGCMにするとサードパーティ製サーバのポストメッセージ---あなたに

答えて

11

Aドキュメントへ/ Cを感謝し、戻ってメッセージIDを受け取り、そのメッセージがすでにデバイスに配信されたことを意味するものではありません。むしろ、それはそれが配達のために受け入れられたことを意味する。メッセージが受け入れられた後に何が起こるかは、多くの要因によって異なります。

デバイスが接続されていてもアイドル状態の場合、delay_while_idleフラグがtrueに設定されていない限り、メッセージはすぐに配信されます。それ以外の場合は、デバイスが起動するまでGCMサーバーに保存されます。 collapse_keyフラグが役割を果たす場所です。同じ折りたたみキー(および登録ID)が保存され、配信を待っているメッセージが既に存在する場合、古いメッセージは破棄され、新しいメッセージが代わりになります(つまり、古いメッセージは新しいメッセージによって折りたたまれます)。ただし、折りたたみキーが設定されていない場合は、新しいメッセージと古いメッセージの両方が将来の配信のために保存されます。

注:折りたたまずに保存できるメッセージの数には制限があります。制限は現在100です。制限値に達すると、格納されているメッセージはすべて破棄されます。

+0

どのうように、単に与えられたIDを持つメッセージの受信ACKのエンドポイントを持つことです私のサーバは、通知が最終的に送信されたとき(正常に)知っていますか? – user1537779

+0

GCMサーバーからその情報を取得することは可能だとは思いません。つまり、メッセージを正常に受信したクライアントアプリケーションとサーバーとの間の別の通信方法に依存する必要があります。 あなたが知っているGCMサーバーからの応答は、次のいずれかを知らせるだけです。 成功:エラーなしで処理されたメッセージの数。 または 失敗:処理できなかったメッセージの数。 –

+0

'利用できないエラーメッセージを見ても通知は送信されませんが、GCMが通知を正常に送信した場合に通知する方法を作ることはできません。 gcmサーバがいつか後でそれらを送信するかどうかわかりません。 – user1537779

2

プッシュ表示ペイロードから分離することでした。私のGCMメッセージには、ペイロードへのURIのみが含まれています。メッセージ内のURIを通じてアクセス可能なデータベーステーブルにペイロードを格納します。

クライアントがメッセージを受信すると、それは、たとえば次のようになります。 HATEOASスタイルのリンクで、次のようになります。

{ 
    _links: { 
    message: { 
     rel: 'message', 
     href: 'https://my-server.com/push/<messageId>' 
    } 
    } 
} 

クライアントは、サーバはそれが配信されていますことを知っているし、それに応じて更新することができ、その時点で、URIからのメッセージペイロードをGETに進みます。ペイロードを取得すると、ペイロードも削除されます。

GCM再配信が十分に堅牢でない場合は、クライアントがすべての保留中のメッセージを手動で取得することもできます(例:ネットワーク接続がオフラインになった後に再開されたときに、指定されたANDROID_IDまたはそれに類するものに関するすべてのメッセージを返すエンドポイントを持つことによって、その後、GCMメッセージである場合、クライアントはそのメッセージのURIに対して404を取得し、これをno-op、つまりすでに処理されたメッセージとして扱います。

これはやり過ぎである場合は、単にメッセージ配信のサーバ意識を達成するための軽量のアプローチは、このような

POST https://my-server.com/push/notifyReceived 

{ 
    messageId: <messageId> 
} 
+0

これは興味深いアプローチですが、質問に直接答えません。 GCMは再配信を試みますか? – Flimm

+1

あなたは正しいです。これはおそらくコメントとして適していたかもしれませんが、ちょっと長いと私は誰かを助けることを望んでいました。 – JHH

関連する問題