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のみを使用します。
誰かがこれを全体として理解するのを手伝ってくれることを願っています。明らかに、この実装を達成するためのいくつかの重要な要素が欠けています。
EjabberdとFCMの両方を一緒に混ぜる必要があります。それが、すべての大きなチャットアプリがそれを実現する方法です。基本的には、XMPPを介してFCMに接続されたApp Server、Ejabberd、およびクライアントアプリの3つのコンポーネントがあります。
これは、必要なものを実現するために必要なアーキテクチャの非常に基本的な説明です。
これは、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
また、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スマートフォンにはそれぞれの設定と制限があります。すべてのデバイスをテストすることはできません。接続を安定させるためのヒントを次に示します。
以上です。お問い合わせは、以下にコメントしてください:)
よろしくRアディティアグメイ
あなたの提案は、tcp/ipがドロップしない接続で有効です。これは、モバイル3G/4Gネットワークには当てはまりません。そのため、実際の3G/4Gネットワークでは、モバイルクライアント/ APPがゾンビ状態(切断)になっている可能性があります。そのため、Firebase/FCMをプレイする必要があります。