XMPP はあなたの要件に合っているようです。あなたの「通知」のサイズと頻度が適切である限り、Google トーク アカウントやその他の XMPP アカウント (例: jabber.org ) を誰かが使用することを確実に許可します (これらは結局無料のサービスです!)。
既存のライブラリを使用して、この問題を解決できるはずです。この投稿では、基本的な XMPP レベルで説明しますが、多くのライブラリは、ここで説明することを行うためのより高いレベルの API を提供します。
必要なさまざまなことを達成する方法に関するいくつかのメモ:
XMPP アカウントへのすべての接続には、「リソース」と呼ばれる一意の識別子が割り当てられます。XMPP では、 のような単純なアドレスは「ベア JID」user@gmail.com
と呼ばれます。リソース(「完全な JID」) を含めることで、特定の接続に送信することもできます。リソースは行き来し、変化する可能性があるため (たとえば、Google はリソースを半ランダム化します)、プレゼンスを使用してリソースの可用性と非可用性をブロードキャストします。user@gmail.com/your-app829abc
モバイル クライアントがプレゼンスをオンラインで確認できるように、デスクトップ クライアントはプレゼンスを送信する必要があります。また、ユーザーの連絡先から通常のチャット メッセージを受信しないように、その存在には「-1」の優先度を含める必要があります。また、モバイル クライアントが他のアプリ (IM クライアントなど) とは別に、ユーザーのアカウントを使用してオンラインで識別できるように、機能または同様の識別情報も含める必要があります。
1 つ注意しなければならないのは、デスクトップ クライアントがオフラインのように見える方法がないことです。モバイル クライアントがプレゼンスを特定できるように、プレゼンスを送信する必要があることは明らかですが、ユーザーの連絡先にもオンラインで表示されます (ユーザーが IM クライアントにサインインしていなくても)。ただし、負の優先度では、IM メッセージを受信できなくなります。
<!-- Desktop sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
モバイル クライアントの観点から見ると、単純に同じアカウントに接続し、同様のプレゼンスを送信する必要があります。自身のプレゼンスを送信した後、連絡先からプレゼンスを受信し、デスクトップ クライアントの接続を含む同じアカウントへの他の接続も自動的に受信します。
<!-- Mobile sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="mobile" />
</presence>
<!-- Mobile receives (among other things): -->
<presence from="user@gmail.com/foo38Bc21e">
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
これで、デスクトップ クライアントの完全な JID が得られました。
プレゼンス パケットの「送信元」に見られるように、通常のXMPP メッセージをデスクトップ クライアントの完全な JID に直接送信できます。XMPP IM メッセージでは、メッセージ内の<body>
要素を使用してテキストを伝えますが、<body>
タグを省略して独自の XML データを挿入できます。
<!-- Mobile sends: -->
<message to="user@gmail.com/foo38Bc21e">
<your-notification xmlns="http://example.com/your-app">
<any-xml-here/>
</your-notification>
</message>
デスクトップでこのメッセージをすぐに受信できます (通常、最大の遅延はモバイル ネットワークで発生します)。モバイルでの XMPP については、XEP-0286: XMPP on Mobile Devicesもご覧ください。