1

機能の中にチャットモジュールがあるAndroidアプリを書いています。ロングポーリングを使用してチャットを実装することを選択しました。

ユーザーの携帯電話のバッテリーを食い尽くすのを避けようとしているので、新しいメッセージについてデバイスに通知する GCM メッセージ プラットフォームを実装に追加することを考えました。

アイデアは、ユーザーが画面でアプリを開いている間にロングポーリングを使用することです。これにより、リアルタイムチャットが高速になり、多くの GCM メッセージを送信する必要がなくなります。アイドル状態のとき、サーバーはユーザーが現在ポーリングしておらず、デバイスに GCM メッセージを送信して、新しいメッセージが到着したときにウェイクアップします。

この方法を実装するいくつかの問題に苦しんでいます。

  1. ユーザーのステータスを知る最善の方法は何ですか - 彼は今ポーリングしているのか、それともプッシュメッセージが起動するのを待っているのか. スリープ状態になったときにサーバーに通知するようにアプリを設定する必要がありますか、それともサーバーがそれを自動的に検出する必要がありますか?

  2. モードを切り替えるタイミングをアプリがサーバーに通知するように設定した場合、この通知が届かなかった場合に回復するにはどうすればよいですか。(クライアントがgcmを待っていて、サーバーがポーリングしていると判断して送信しない場合..)

  3. クライアントがポーリングしていて、新しいメッセージを受信して​​もサーバーが応答しない場合がありました。クライアントが認識していないサーバー上のある種のタイムアウトかもしれません...それがバグである場合は修正しますが、サーバーが認識していない間にクライアントがポーリングしていると考えている場合はどうすればよいですか (要求のタイムアウトが長すぎて、次のポーリングを待機できません)。

私のクライアントはネイティブの Android で、Web サービスは WCF (C#) です。

どんな考えでも役に立ちます。

4

1 に答える 1

2

私は GCM を使用したことはありませんが、モバイルで多くのメッセージング アプリケーションを使用した経験があるので、私たちが従ったことを説明しようとします。

ユーザーのステータスを知る最良の方法は何ですか

まず第一に、アプリが前面にあるときに長いポーリングを行うのは、インスタント メッセージを受信する最良の方法ではありません。すぐに受信するには、tcp 接続を開いたままにしておく必要があります。(できれば、通知にもメッセージが含まれている必要があります) どのような種類のポーリングでも、バッテリを浪費し、インスタントメッセージを受信しないことが保証されます。2番目-サーバーが応答方法を認識できるように、クライアントはサーバーにその状態( foreground/background )を通知する必要があると思います。したがって、私の提案は、CIRにTCPソケットを使用し、バックグラウンドでポールをバックアップとして使用することです(サーバーが「クライアントがバックグラウンドメッセージに移動した」を失った場合)

  1. 回復するには、長いポーリング (10 分) を使用してサーバーから更新を取得し、サーバーに状態を通知します。

  2. 私が言及したアプローチ(tcpソケットを使用)を使用する場合、サーバーは、接続が有効である限り、アプリがフォアグラウンドにあることを認識している必要があります。また、サーバーは常にデルタ更新でポーリングに応答する必要があります(サーバーが最後に何かを送信したときにポーリングを送信する必要があります)

お役に立てれば。

于 2012-11-02T09:42:41.043 に答える