web-dev-qa-db-ja.com

Androidのプッシュ通知にXMPPサーバーとGoogle Cloud Messaging(またはより新しいFirebase Cloud Messaging)を使用するためのチャットアプリ)

Android用のチャットアプリを開発しています。私は何週間もXMPPとGoogleクラウドメッセージング(およびFirebaseクラウドメッセージング)について読んでいますが、まだ非常に混乱しています。

現在、すでにXMPPサーバーをローカル(Ejabberd)にセットアップし、Smackライブラリーを使用してAndroidアプリをXMPPサーバーに正常に接続しました。

理解するには、プッシュ通知にGCMまたは新しいFCMを使用する必要があるため、Google Cloud Platformでプロジェクトを作成しました。私のAndroidアプリは、(XMPPサーバーに直接接続する代わりに)Smackライブラリを使用してそれに接続できます。私のサーバーには、小さなJavaアプリがありますSmackライブラリも使用してGCMに接続します。

ここまではすべて順調です。私の大きな混乱は次のとおりです。プッシュ通知にGCMでXMPPサーバーを使用するにはどうすればよいですか?サーバー側の実装で見つかったすべてのドキュメント、例、ガイド、チュートリアルは、GCMに接続する方法を教えてくれますが、なしXCMPサーバーをGCMと組み合わせて使用​​する方法を教えてください。 何が足りないのでしょうか?私のJavaアプリはGCMに接続し、GCMとの間でメッセージを送受信するだけですが、XMPPサーバーは何もしていません。実際に私の= AndroidアプリとサーバーJavaアプリはXMPPサーバーではなくGCMのみを使用します。

誰かがこれを全体として理解するのを手伝ってくれることを願っています。明らかに、この実装を達成するためのいくつかの重要な要素が欠けています。

18

EjabberdとFCMの両方を一緒に混ぜる必要があります。それが、すべての大きなチャットアプリがそれを実現する方法です。基本的には、XMPPを介してFCMに接続されたApp Server、Ejabberd、およびクライアントアプリの3つのコンポーネントがあります。

  1. アプリがフォアグラウンドにある場合、Smackライブラリを使用してEjabberdサーバーに直接接続し、メッセージを送信し、ユーザーのプレゼンスを変更します。Ejabberdへの接続はその間保持されますです。 do n'tこの時間中にアップストリームメッセージを送信します!
  2. ユーザーがアプリから離れると、接続を閉じるになります。ユーザーは、「退席中」または「オフライン」と見なされます。
  3. この時点から、App ServerはFCMと通信して、Smackライブラリを使用してダウンストリームメッセージをデバイスに送信します。
  4. クライアントデバイス上:受信メッセージを処理し、通知を表示します。 Android N、ユーザーは通知から直接返信できます。この場合、FCMを使用してアップストリームメッセージをアプリサーバーに送信すると仮定します。 Ejabberdサーバーに。
  5. ユーザーが通知をタップすると、アプリがフォアグラウンドに戻り、Ejabberdに再接続になり、ステップ1に戻ります。

これは、必要なものを実現するために必要なアーキテクチャの非常に基本的な説明です。

14
Nimrod Dayan

これは、Firebase Cloud Messaging(FCM)XMPP接続サーバーを紹介するサンプルJavaプロジェクトです。このプロジェクトは、より大きなプロジェクトのベースとして開発した非常にシンプルなスタンドアロンサーバーです。このサーバーは、XMPPプロトコルを使用してFCM CCSサーバー経由でクライアントアプリにデータを送信します。

https://github.com/carlosCharz/fcmxmppserver

また、YouTubeでビデオを作成し、その機能を説明しています。

https://www.youtube.com/watch?v=PA91bVq5sHw

それがあなたの役に立つことを願っています。

FCM(以前のGCM)に接続するJavaサーバーをセットアップする必要があります。その後、デバイスからアップストリームメッセージをFCMに送信し、FCMはそのアップストリームメッセージをJavaサーバーとその中のJavaサーバーでは、そのアップストリームメッセージを処理して、対象デバイスにダウンストリームメッセージを送信できます。デバイス側では、それらのダウンストリームを処理できますプッシュ通知を行うために受信されるメッセージ。

いくつかの便利なリンク:

アップストリームメッセージの送信方法:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

ダウンストリームメッセージの受信および処理方法:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

サンプルの設定方法Java server:
https://stackoverflow.com/a/38170310/443365

5
Riley MacDonald

また、Smackの最新バージョンであるSmack v.4.1.8を使用してAndroidを使用してチャットアプリケーションを構築しています。サーバーはejabberdを使用しています。GCMやFirebaseなどのサードパーティを使用してユーザーからユーザーへのダウンストリームメッセージ私が間違っていなければ、GCMまたはFirebaseを使用してユーザーからユーザーへのメッセージをプッシュします。

どうして? TCPプロトコルは、接続が確立され、まだ接続されているときに、Appに登録した呼び出しリスナーをリッスンし続けます。Smackには"addAsyncStanzaListener()"

addAsyncStanzaListenerは、Appで受信パケットをリッスンするために使用されます。彼らは持っている

 public void processPacket(Stanza packet) 

あなたはそれを呼び出すことができます、そして、あなたは時間をかけてパケットを聞くでしょう。

私は、Smackの安定した接続を維持することについて調査しています。ほとんどのAndroidスマートフォンにはそれぞれの設定と制限があります。すべてのデバイスをテストすることはできません。接続を安定させるためのヒントを次に示します。

  1. BackgroundServiceの代わりにForegroundServiceを使用します。ほとんどのAndroidデバイスにはバックグラウンドで実行されるアプリに対する制限があります。タスクマネージャーからアプリをスワイプするとアプリが強制終了されます。パワー管理)
  2. ForegroundServiceは、アプリがアイドル状態になるのを防ぎます。
  3. ReconnectingManagerを登録する
  4. Pingfailedを登録する
  5. ServerPingWithAlarmManagerを登録する

以上です。お問い合わせは、以下にコメントしてください:)

よろしくRアディティアグメイ

1
raditya gumay

あなたの提案は、tcp/ipがドロップしない接続で有効です。これは、モバイル3G/4Gネットワ​​ークには当てはまりません。そのため、実際の3G/4Gネットワ​​ークでは、モバイルクライアント/ APPがゾンビ状態(切断)になっている可能性があります。そのため、Firebase/FCMをプレイする必要があります。

0
TC Juan