web-dev-qa-db-ja.com

Androidはほぼリアルタイムのプッシュ通知をサポートしますか?

私は最近iPhoneアプリがほぼ瞬時に受信する能力について学びました アプリへの通知 アプリへの通知

これはプッシュ通知の形で提供され、iPhoneへのデータ接続を常にオンにし、バイナリパケットをアプリにメッセージで送るアラートをポップアップします信じられないほどすぐに0.5〜5秒サーバーアプリから電話アプリへの応答時間。これは、受信メッセージとしてではなく、データプランの一部として請求される非常に小さなパケットで、SMSではなく、データとして送信されます。

私は、Androidを使用しても同様の機能があるのか​​、それともAndroid APIを使用してこれに近いものを実装することが可能であるのかを知りたいと思います。明確にするために、私は同様に定義します:

  • SMSメッセージではなく、データ駆動型のソリューション
  • 可能な限りリアルタイム
  • スケーラブル、つまり、モバイルアプリのサーバー部分として、数千のアプリインスタンスに数秒で通知することができます

私はこのアプリがプルベースのHTTPリクエスト/レスポンススタイルであることを認めていますが、理想的には通知をチェックするためだけにポーリングを行いたくないということです。それに加えて、それはデータプランを排出する点滴のようなものです。

330
j pimmel

Firebase Cloud Messaging FCM FAQ はGCMの新しいバージョンです。 Android、iOS、Chromeで確実にメッセージを配信するためにGCMのコアインフラストラクチャを継承しています。しかし、今日では多くの開発者が通知を処理するためにGCM SDKを使用しており、クライアントアプリのアップグレードには時間がかかるため、彼らは引き続きGCMをサポートします。

2012年6月26日現在、 Google Cloud Messaging は、デバイス上で実行されているアプリケーションにメッセージを送信するための推奨される方法です。

以前(そして現在は非推奨)、サービスは Cloud To Device Messaging と呼ばれていました。

211
j pimmel

XMPP が良い解決策です。私はこれをプッシュ対応のリアルタイムAndroidアプリケーションに使用しました。 XMPPは強力で、非常に拡張性があり、統合と使用が簡単です。

たくさんの無料のXMPPサーバーがありますが(礼儀正しく使わないでください)、オープンソースのサーバーもあります。 OpenFire は素晴らしい選択です。

あなたが望むライブラリはSmackではありません、上記のように aSmack です。ただし、これはビルド環境です - ライブラリをビルドする必要があります。

これは、XMPPソリューションのバッテリ寿命への影響について計算したものです。

Androidクライアントは、定期的にウェイクアップしてXMPPサーバーにハートビートを送信することによって、永続的なTCP接続を維持する必要があります。
これは明らかに電力使用量の点でコストがかかります。この費用の見積もりは以下のとおりです。

  • 1400mAhバッテリーを使用する(Nexus OneおよびHTC Desireに付属)
  • 3Gネットワ​​ークに接続されたアイドル状態のデバイスは、約5mAを消費します
  • ウェイクアップ、ハートビート、スリープサイクルは5分ごとに発生し、完了するのに3秒かかり、300mAを消費します
  • したがって、1時間あたりのバッテリ使用量のコストは次のようになります。
    • 36秒300mA = 3mAhでハートビートを送信
    • アイドル時3600秒5mA = 5mAh
    • 4:95 + 3 = 7:95 mAhを組み合わせた
  • 1400mAhのバッテリーは、アイドル状態で約11。6日、アプリケーションを実行すると約7。3日持続します。これは、バッテリー寿命の約37%の短縮を表します。
  • ただし、実際にはデバイスが完全にアイドル状態になることはほとんどないため、バッテリ寿命の37%の減少は、実際には絶対に最悪の場合を表します。
46
flesh

私は最近、あなたが求めていることをするための方法として、Android用のMQTT http://mqtt.org で遊び始めました(つまりSMSではなく、データ駆動、ほぼ即時のメッセージ配信)。スケーラブル、ポーリングしないなど)

それが役に立つ場合に備えて、私はこれに関する背景情報を持ったブログ記事を持っています http://dalelane.co.uk/blog/?p=938

(注:MQTTはIBMの技術であり、私はIBMに勤務していることを指摘する必要があります。)

32
dalelane

Xtify プラットフォームを見てください。これは彼らがやっていることのように見えます、

13
peter

GoogleはC2DMを減価償却していますが、その代わりにGCM(Google Cloud Messaging)を導入しています。 Android 2.2以降が必要です。 http://developer.Android.com/guide/google/gcm/index.html

12
William L.

バックエンドとしてMeteor cometサーバーを使用して、Androidでプッシュ通知用のJavaライブラリーを開発する新しいオープンソースの取り組みがあります。あなたはそれをチェックアウトすることができます ディーコンプロジェクトブログ 。開発者が必要ですので、Wordを広めてください。

8
mtbkrdave

あなたがターゲットとしているマーケットのためにそこにあるGoogleライブラリに頼ることができるなら、あなたはそれを望むかもしれませんGTalkに戻る機能(既存のユーザ名にリソースを登録する) BroadcastReceiverを使って).

そうでなければ、そして私は期待しています あなたはできません 、それであなたはXMPPのあなた自身のバージョンをバンドルするになります。これは面倒ですが、XMPPが独立したライブラリとして別々にバンドルされている場合はもっと簡単になるかもしれません。

PubSubHubub と考えることもできますが、ネットワークの使い方はわかりません。私はそれがXMPPの上に構築されていると思います。

8
jamesh

私はこれを調べてきました、そしてjameshが推奨するPubSubHubBubはオプションではありません。 PubSubHubBubは、サーバー間通信を目的としています。

「私はNATの背後にいます。Hubに加入できますか?Hubは私に接続できません。」

/匿名

いいえ、PSHBはサーバー間プロトコルです。あなたがNATの背後にいるなら、あなたは本当にサーバではありません。このようなクライアントに対してハングゲット( "ロングポーリング")やメッセージボックスポーリングを実行するためのオプションのPSHB拡張のアイデアを取り上げましたが、それはコアスペックにはありません。コアスペックはサーバー間のみです。

/ Brad Fitzpatrick、サンフランシスコ、CA

ソース: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (直接リンクはできません)

最も簡単な方法は、Comet HTTP Pushを使用することです。これは単純でよく理解されているソリューションですが、Webアプリケーションにも再利用できます。

私が最近開発した http://pushdroid.org googleが2.2でそれを実装して意図的に放送しているのと同じように、Googleが2.2でそれを実装したように電話にインストールされるべきです。

6
Stefan

読んだ場所が見つかりませんが、gmailではオープンなTCP接続を使用して電子メールプッシュを実行していると思います。

6
Will

グーグルは最近(18May2016) 発表 that --- Firebase 今ではほぼリアルタイムのプッシュ通知を含むモバイル開発者のための統一されたプラットフォームです。それはまたマルチプラットフォームです:

同社は現在、すべてのFirebaseユーザーに、iOS、Android、Webをサポートする無料で無制限の通知を提供しています。

出典

6
Freek Nortier

なぜあなたはXMPP実装を使わないでください。今ではgtalk、Jabber、citadelなどを含む非常に多くの公開サーバーが利用可能です。Androidの場合、SMACKという名前のSDKもあります。これはプッシュ通知とは言えませんが、XMPPを使用すると、クライアントとサーバー間で接続を開いたままにして、双方向通信を可能にすることができます。 Androidクライアントとサーバーの両方が互いに通信できることを意味します。現在のところ、これはAndroidのPushの必要性を満たすでしょう。私はサンプルコードを実装しました、そしてそれは本当にうまくいきます

6
Rahul Patel

GTalkはSDKから削除されたため、「標準の」プッシュメッセージングシステムを作成することをお勧めします。このようにして、実行する必要があるサービスは1つだけで、追加で必要なTCP接続は1つだけです。アプリケーションはIntentsを使用してこのサービスと通信し、最初にサービスとの間で通知を送受信する許可を要求する必要があります。その後、サービスは、新しいアプリケーションがメッセージを送受信したいことをユーザーに通知します。その後、ユーザーは許可を付与または拒否します。そのため、ユーザーは管理下に置かれたままになります。アプリケーションはアクション+カテゴリをサービスに登録するので、サービスはプッシュされたメッセージの配信方法を認識します。

いい考えでしょうか。

6
MrSnowflake

GCMの問題点は、プロセスに多くの設定が含まれていることです。

  • あなたはあなたのAndroidアプリに定型文をたくさん追加する必要があります
  • GCMサーバーと通信するように外部サーバーを構成する必要があります。
  • テストを書く必要があります

あなたが(私のような)単純なものを好む場合は、 rbanAirship を試してください。多くの設定をしなくても、アプリ内でGCMを使用する最も簡単な方法は(私見)です。また、GCMメッセージが正しく配信されていることをテストするためのわかりやすいGUIも提供されます。

  • ドキュメントと入門ガイドを見つけることができます ここ
  • あなたはサンプルアプリケーションを見つけることができます ここ

注:私はいかなる方法でもUrbanAirshipと提携していません

4
fernandohur

https://github.com/Guti/Google-Cloud-Messaging--Titanium-/blob/master/src/com/google/Android/gcm/GCMRegistrar.Java

Pushのための本当によくて実用的な解決策。

試してください

2
Pooja Roy

彼らはあなたのコードでそれらのライブラリクラスを使うことによってあなたによって使われなければならない彼らのリスナーを持っています。あなたはプッシュを気にする必要はありません。あなたはサーバーにメッセージを送信する必要がありますデバイスにメッセージをプッシュします。彼らはOAuthを使います。プロトコルに関しては、CCSとXMPPを使用する方法が2つあります。 CCSは認証されたトランスポート層としてXMPPを使用するだけなので、ほとんどのXMPPライブラリを使用して接続を管理できます。デバイスに通知を送信するには、Androidアプリにコードを書いてサーバーコードを送信します。メッセージ送信はあなたのコードによってのみ行われます。 GCMの場合、残りはGoogle Serverによって処理されます。あなたはこのリンクで詳細をチェックすることができます

http://developer.Android.com/google/gcm/server.html

また、セキュリティ問題

googleクラウドメッセージングのセキュリティ https://groups.google.com/forum/#!topic/Android-gcm/M-EevBitbhQ

アプリが実行されていない場合は、ブロードキャストリスナー用のコードを記述する必要があるため、デバイスから通知を受け取ることもできます。バックグラウンドでそれはサーバを聞いているでしょう、そしてどんなメッセージパケットもそこにあるであろう時はいつでもそれは通知としてメッセージを受け取るでしょう。 Androidには、気にしないために必要なサービスがあります。あなたはあなたの仕事をより容易にするライブラリクラスを使用してそれらのリソースを使用するだけでよく、そしてあなたのアプリが実行されていないならそれらが書くことを可能にしそれからそれは通知を受け取る。明らかに、このリンクの「メッセージを受信する」セクションをチェックして、受信者にアプリを受信させるための何らかのリスナーがあります。

http://developer.Android.com/google/gcm/client.html

ユーザーからの要求も受け入れます。 GCMのためにそれはするでしょう。 「メッセージを送る」にチェックを入れてください

http://developer.Android.com/google/gcm/client.html

2
ajitksharma