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


343

私は最近、ほぼ瞬時に受信するためのiPhoneアプリの能力を知ったアプリに通知を アプリケーションに通知

これはプッシュ通知の形式で提供されます。これは、iPhoneへのデータ接続を常に維持し、アプリへのバイナリパケットのメッセージを送信する特注のプロトコルです。これにより、サーバーアプリから電話アプリへの0.5〜5秒の間に非常に迅速にアラートがポップアップ表示されます。反応時間。これは、SMSではなくデータとして送信され、着信メッセージとしてではなく、データプランの一部として課金される非常に小さなパケットで送信されます。

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

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

アプリがプルベースのHTTPリクエスト/レスポンススタイルである可能性を高く評価していますが、通知を確認するためだけにこれを頻繁にポーリングしたくない場合があります。それ以外は、データプランをドリップドレインするようなものです。


3
gmailとgchatの通知は通常、そのしきい値内です。あなた自身のアプリでこれを複製する方法があるはずです。
Dana the Sane

はい、プッシュメッセージングを非常に簡単にするAndroidライブラリがあります... アプリにJigyのDroid Notificationsライブラリを含めるだけで、そこから約10行のコードが得られます...これが役に立てば幸いです:)
Corey Harden

信頼性を向上させるために内部で MQTTを使用するリアルタイムプッシュ通知ゲートウェイについては、Pushypushy.me)を確認してください。完全な開示-私はプッシーを設立しました。
Elad Nava

回答:


215

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

2012年6月26日の時点で、Googleクラウドメッセージングは、デバイスで実行されているアプリケーションにメッセージを送信するための推奨される方法です。

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


14
Googleは、code.google.com / android / c2dmでこれをJavaのAndroidアプリに実装するための詳細なドキュメントを提供していますが、C2DMのサーバー側の側面と通信するためのサンプルコードが不足しています。私はここでその様相ためのチュートリアルを書いている:blog.boxedice.com/2010/10/07/...
DavidM

2
Android 2.2を使用しているユーザーにプッシュ通知を提供する方法はありますが、プッシュ通知なしで同じアプリを古いディストリビューションで実行可能にする方法はありますか?
OneWorld

3
@OneWorld:はい、ちょうど他のAndroidの下位互換性技術、使用反射C2DMが使用できない場合より参照のために、代替戦略を選択するように:developer.android.com/resources/articles/...
リー・ライアン

1
developer.android.com/videos/index.html#v=PLM4LajwDVcプッシュ通知に関するGoogle I / O 2010プレゼンテーション
vokilam

6
C2DMは2012年6月26日をもって正式に非推奨になりました。代わりに[Google Cloud Messaging for Android](developer.android.com/guide/google/gcm/index.html
Mithun Sreedharan

47

XMPPは優れたソリューションです。プッシュ対応のリアルタイムAndroidアプリケーションで使用しました。XMPPは強力で拡張性が高く、統合や使用が簡単です。

たくさんの無料のXMPPサーバーがあり(ただし、礼儀としては乱用しないでください)、独自のボックスの1つで実行できるオープンソースサーバーがあります。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:95mAhの組み合わせ
  • 1400mAhバッテリーは、アイドル状態で約11.6日間、アプリケーションを実行すると7.3日間持続します。これは、バッテリー寿命が約37%短縮されることを意味します。
  • ただし、37%のバッテリー寿命の短縮は、デバイスが完全にアイドル状態になることはめったにないため、実際には最悪のケースを表しています。

2
ただし、実際には、電話が起動したり、スイッチがオンになったり、ネットワークの状態が変化したりすると、何百ものインテントが実行されるため、アプリがこれを実行すると、電話は3時間持続します。
Monstieur 2014

33

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

参考にできるように、これに関する背景情報をブログに投稿しています。http://dalelane.co.uk/blog/?p = 938

(注:MQTTはIBMテクノロジーであり、私がIBMで働いていることを指摘しておきます。)


mqttはこれをどのように行っていますか?どこかに投票が必要なのでしょうか?アップルでさえポーリングする必要がありますが、それらは一度に1つの接続しか実行していないため、バッテリーをそれほど消耗していません...
Janusz

3
TCP / IP接続を開き、開いたままにします。ポーリングは行われませんが、接続を維持するために接続に小さなpingメッセージを送信する必要がある場合があります。
dalelane 2011

MQTTは、Googleを介してプッシュメッセージを送信すると不快になる場合に最適です。また、クライアントとの機密保持契約を締結しており、データ交換にクラウドサービスを使用することを禁止しています。
VH-NZZ 2016



8

あなたが市場をターゲットにするためにそこにあるGoogleライブラリに依存できる場合は、GTalk機能に便乗することをお勧めします(既存のユーザー名でリソースを登録します-BroadcastReceiverで受信したメッセージをインターセプトします)。

そうでない場合、私はあなたができないと思います、そしてあなたはあなた自身のバージョンのXMPPバンドルすることになります。これは骨の折れる作業ですが、XMPPがスタンドアロンライブラリとして個別にバンドルされていると、作業が簡単になる場合があります。

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


私は、gtalkライブラリがデバイス上にある限り、ピギーバック機能が常に利用可能であるという記事の統計を考えています。実際にそれを行う方法の例を含むリソースがありますか?
Janusz

GTalkは1.0(iirc)からSDKから削除されました。
MrSnowflake 2010年

8

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

「私はNATの背後にいます。ハブにサブスクライブできますか?ハブは私に接続できません。」

/匿名

いいえ、PSHBはサーバー間プロトコルです。NATの背後にいる場合は、実際にはサーバーではありません。このようなクライアントのハング取得(「ロングポーリング」)やメッセージボックスポーリングを実行するためのオプションのPSHB拡張機能のアイデアを検討してきましたが、コアスペックには含まれていません。コア仕様はサーバー間のみです。

/ Brad Fitzpatrick、サンフランシスコ、カリフォルニア

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

最も単純な方法は、Comet HTTPプッシュを使用することであるという結論に達しました。これはシンプルでよく理解されたソリューションですが、Webアプリケーションで再利用することもできます。


8

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


7

Googleは最近(2016年5月18日)、Firebaseがほぼリアルタイムのプッシュ通知を含むモバイルデベロッパー向けの統合プラットフォームになったことを発表しました。これもマルチプラットフォームです。

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

ソース


6

どこで読んだかわかりませんが、Gmailは開いているTCP接続を利用してメールをプッシュしています。


これをサポートしていると思われるAndroidアプリの開発者によるjoelapenna.com/blog/2009/07/android-foursquare-and-pushにブログ投稿があります。
dalelane

これらは私には思えます、彼らも投票しています。モバイルデバイスはサーバーに接続し、更新を待機していることをサーバーに通知します。実際のプッシュはサーバーによって開始されます。これはモバイルデバイスにとって非常に困難であり、ほとんどの場合、ネットワークプロバイダーのサポート(sms / wapプッシュ)を
伴い

1
「C2DMにより、サードパーティの開発者はGoogleアプリと同じサービスを使用できます。」Androidクラウドからデバイスメッセージングへ
コロシアム2010

6

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

良いアイデアでしょうか?


6

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


サンプルコードへのリンクを提供することに気をつけていますか?バッテリー寿命に関するテストを行いましたか?
アレックス

バッテリー寿命のテストを行いました。6分ごとに送信する必要があるハートビートにより、最悪の場合、バッテリー寿命が30%減少します(つまり、デバイスはウェイクアップしてハートビートを送信するだけです)。最良の場合(ユーザーがデバイスをブラウジング、通話などに使用している場合)、バッテリー寿命への影響は無視できます。

6

私は最近http://pushdroid.orgを開発しました。これは、グーグルが2.2で実装したのと同じように電話にインストールする必要がある単一のアプリケーションです。これは1.5から動作し、意図的にブロードキャストしています。


4

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

  • Androidアプリに多くのボイラープレートを追加する必要があります
  • GCMサーバーと通信するように外部サーバーを構成する必要があります
  • テストを書く必要があります

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

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

注:私はいかなる方法でもUrbanAirshipとは関係ありません



2

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.