Apakah Android mendukung pemberitahuan push real time?


343

Baru-baru ini saya belajar tentang kemampuan aplikasi iPhone untuk menerima pemberitahuan hampir seketika ke aplikasi pemberitahuan ke aplikasi .

Ini disediakan dalam bentuk pemberitahuan push, sebuah protokol yang dipesan lebih dahulu yang menjaga selalu koneksi data ke iPhone dan paket pesan biner ke aplikasi, yang muncul peringatan sangat cepat, antara 0,5 - 5 detik dari aplikasi server kirim ke aplikasi telepon waktu merespon. Ini dikirim sebagai data - bukan SMS - dalam paket yang sangat kecil yang dibebankan sebagai bagian dari paket data bukan sebagai pesan masuk.

Saya ingin tahu apakah, menggunakan Android, ada fasilitas serupa, atau apakah mungkin menerapkan sesuatu yang dekat dengan ini menggunakan API Android. Untuk memperjelas, saya mendefinisikan serupa dengan:

  • Bukan pesan SMS, tetapi beberapa solusi berbasis data
  • Waktu yang sesingkat mungkin
  • Dapat diukur, misalnya, sebagai bagian server dari aplikasi seluler, saya dapat memberi tahu ribuan instance aplikasi dalam hitungan detik

Saya menghargai aplikasi bisa berbasis tarik, gaya permintaan / respons HTTP, tapi idealnya saya tidak ingin terlalu banyak polling hanya untuk memeriksa notifikasi; selain itu seperti mengeringkan rencana data.


3
Notifikasi untuk gmail dan gchat biasanya dalam ambang itu. Seharusnya ada cara untuk mereplikasi ini di aplikasi Anda sendiri.
Dana the Sane

Ya, Ada perpustakaan android yang membuat pengiriman pesan menjadi sangat sederhana ... sertakan saja perpustakaan Notifikasi Droid Jigy di aplikasi Anda dan dari sana hanya ada sekitar 10 baris kode ... semoga ini membantu :)
Corey Harden

Lihat Pushy ( pushy.me ) untuk gateway notifikasi push realtime yang menggunakan MQTT di bawah tenda untuk meningkatkan keandalan. Pengungkapan penuh - Saya mendirikan Pushy.
Elad Nava

Jawaban:


215

Firebase Cloud Messaging FCM FAQ adalah versi baru GCM. Ini mewarisi infrastruktur inti GCM untuk mengirimkan pesan andal di Android, iOS dan Chrome. Namun mereka akan terus mendukung GCM karena banyak pengembang menggunakan GCM SDK hari ini untuk menangani notifikasi, dan peningkatan aplikasi klien membutuhkan waktu.

Pada tanggal 26 Juni 2012, Google Cloud Messaging adalah cara yang disukai untuk mengirim pesan ke aplikasi yang berjalan di perangkat.

Sebelumnya (dan sekarang sudah tidak digunakan lagi), layanan itu disebut Cloud to Device Messaging .


14
Google menyediakan dokumentasi terperinci untuk mengimplementasikan ini ke aplikasi Android Anda di Java di code.google.com/android/c2dm tetapi kode sampel mereka untuk berkomunikasi dengan aspek sisi server C2DM masih kurang. Saya telah menulis sebuah tutorial untuk aspek itu di sini: blog.boxedice.com/2010/10/07/...
DavidM

2
Apakah ada cara untuk menawarkan pemberitahuan push kepada pengguna dengan Android 2.2, tetapi membuat aplikasi yang sama dapat dijalankan pada distribusi yang lebih lama, hanya tanpa pemberitahuan push?
OneWorld

3
@OneWorld: ya, sama seperti teknik kompatibilitas mundur Android lainnya, gunakan refleksi untuk memilih strategi alternatif ketika C2DM tidak tersedia, untuk lebih banyak melihat: developer.android.com/resources/articles/…
Lie Ryan

1
developer.android.com/videos/index.html#v=PLM4LajwDVc Google I / O 2010 Presentasi tentang Pemberitahuan Push
vokilam

6
C2DM telah secara resmi dihentikan pada 26 Juni 2012, gunakan [Google Cloud Messaging untuk Android] ( sebaliknya developer.android.com/guide/google/gcm/index.html
Mithun Sreedharan

47

XMPP adalah solusi yang bagus. Saya telah menggunakannya untuk aplikasi Android yang diaktifkan dan diaktifkan secara waktu nyata. XMPP kuat, sangat extensible dan mudah diintegrasikan dan digunakan.

Ada banyak server XMPP gratis (meskipun karena kesopanan Anda tidak boleh menyalahgunakannya) dan ada server open source yang dapat Anda jalankan di salah satu kotak Anda sendiri. OpenFire adalah pilihan yang sangat baik.

Perpustakaan yang Anda inginkan bukan Smack seperti disebutkan di atas, itu adalahSack . Tetapi perhatikan, ini adalah lingkungan build - Anda harus membangun perpustakaan.

Ini adalah perhitungan yang saya lakukan pada dampak masa pakai baterai dari solusi XMPP:

Klien Android harus mempertahankan koneksi TCP yang persisten dengan bangun secara berkala untuk mengirim detak jantung ke server XMPP.
Ini jelas membebankan biaya dalam hal penggunaan daya. Perkiraan biaya ini disediakan di bawah:

  • Menggunakan baterai 1400mAh (seperti yang disediakan di Nexus One dan HTC Desire)
  • Perangkat idle, yang terhubung ke jaringan 3G, menggunakan sekitar 5mA
  • Siklus bangun, detak jantung, tidur terjadi setiap 5 menit, membutuhkan tiga detik untuk menyelesaikan dan menggunakan 300mA
  • Karenanya, biaya penggunaan baterai per jam adalah:
    • 36 detik 300mA = 3mAh mengirimkan detak jantung
    • 3600 detik 5mA = 5mAh saat idle
    • 4:95 + 3 = 7: 95mAh digabungkan
  • Baterai 1400mAh berlangsung sekitar 11,6 hari saat idle dan 7,3 hari saat menjalankan aplikasi, yang mewakili pengurangan sekitar 37% dalam masa pakai baterai.
  • Namun, pengurangan usia baterai sebesar 37% merupakan kasus terburuk absolut dalam praktik mengingat perangkat jarang menganggur sepenuhnya.

2
Namun dalam praktiknya ponsel akan bertahan 3 jam ketika aplikasi melakukan ini karena ratusan maksud berjalan ketika ponsel bangun atau menampilkan switch atau keadaan jaringan berubah.
Monstieur

33

Saya baru-baru ini mulai bermain dengan MQTT http://mqtt.org untuk Android sebagai cara untuk melakukan apa yang Anda minta (yaitu bukan SMS tetapi data didorong, pengiriman pesan yang hampir segera, terukur, tidak polling, dll.)

Saya memiliki posting blog dengan informasi latar belakang tentang hal ini jika bermanfaat http://dalelane.co.uk/blog/?p=938

(Catatan: MQTT adalah teknologi IBM, dan saya harus menunjukkan bahwa saya bekerja untuk IBM.)


Bagaimana mqtt melakukan ini? Pasti ada polling yang terlibat di suatu tempat? Bahkan apel harus mengadakan jajak pendapat, tetapi saya pikir mereka hanya melakukan satu koneksi pada satu waktu sehingga tidak menguras baterai sebanyak itu ...
Janusz

3
Itu melakukannya dengan membuka koneksi TCP / IP dan membiarkannya terbuka. Itu tidak polling, meskipun kadang-kadang harus mengirim pesan ping kecil ke sambungan untuk tetap hidup.
dalelane

MQTT jelas merupakan cara yang harus ditempuh jika mengirim pesan push melalui Google membuat Anda tidak nyaman. Selain itu, kami memiliki perjanjian kerahasiaan dengan klien kami yang melarang penggunaan layanan cloud untuk pertukaran data.
VH-NZZ



8

Jika Anda dapat bergantung pada pustaka Google yang ada di sana untuk target pasar Anda, maka Anda mungkin ingin mengembalikan fungsionalitas GTalk (mendaftarkan sumber daya pada nama pengguna yang ada - memotongnya saat menerima pesan dengan BroadcastReceiver).

Jika tidak, dan saya berharap Anda tidak bisa , maka Anda akan menggabungkan versi XMPP Anda sendiri . Ini menyakitkan, tetapi dapat dibuat lebih mudah jika XMPP dibundel secara terpisah sebagai perpustakaan mandiri.

Anda juga dapat mempertimbangkan PubSubHubub , tetapi saya tidak tahu penggunaan jaringannya. Saya percaya itu dibangun di atas XMPP.


Saya pikir artikel statistik bahwa fungsi piggy back akan selalu tersedia selama pustaka gtalk ada di perangkat. Apakah Anda memiliki beberapa sumber daya dengan contoh cara melakukan itu?
Janusz

GTalk dihapus dari SDK sejak 1.0 (iirc).
MrSnowflake

8

Saya telah melihat ini dan PubSubHubBub direkomendasikan oleh jamesh bukan merupakan pilihan. PubSubHubBub dimaksudkan untuk komunikasi server ke server

"Aku di belakang NAT. Bisakah saya berlangganan Hub? Hub tidak dapat terhubung ke saya."

/Anonim

Tidak, PSHB adalah protokol server-ke-server. Jika Anda berada di belakang NAT, Anda sebenarnya bukan server. Meskipun kami telah menemukan ide-ide untuk ekstensi PSHB opsional untuk melakukan hang mendapat ("polling panjang") dan / atau pollagebox polling untuk klien seperti itu, itu tidak dalam spesifikasi inti. Spesifikasi inti adalah server-ke-server saja.

/ Brad Fitzpatrick, San Francisco, CA

Sumber: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (tautan langsung tidak memungkinkan)

Saya sampai pada kesimpulan bahwa metode paling sederhana adalah dengan menggunakan push Comet HTTP. Ini adalah solusi yang sederhana dan dipahami dengan baik tetapi juga dapat digunakan kembali untuk aplikasi web.


8

Ada upaya open-source baru untuk mengembangkan perpustakaan Java untuk pemberitahuan push di Android, menggunakan server komet Meteor sebagai backend. Anda dapat melihatnya di Blog Proyek Diakon . Kami membutuhkan pengembang, jadi tolong sebarkan berita ini!


7

Google baru-baru ini (18 Mei2016) mengumumkan bahwa Firebase sekarang merupakan platform terpadu untuk pengembang seluler termasuk notifikasi push real time. Juga multi-platform:

Perusahaan sekarang menawarkan kepada semua pengguna Firebase notifikasi gratis dan tidak terbatas dengan dukungan untuk iOS, Android dan Web.

sumber


6

Saya tidak dapat menemukan tempat saya membacanya, tetapi saya percaya gmail menggunakan koneksi TCP terbuka untuk melakukan push email.


Ada posting blog di joelapenna.com/blog/2009/07/android-foursquare-and-push oleh pengembang aplikasi Android yang tampaknya mendukung ini.
dalelane

Ini bagi saya, mereka juga pemungutan suara. Perangkat seluler membuat koneksi ke server dan memberi tahu server itu menunggu pembaruan. Push sebenarnya diprakarsai oleh server, yang sangat sulit untuk perangkat seluler, dan sebagian besar waktu melibatkan dukungan penyedia jaringan (sms / wap push) ...
MrSnowflake

1
"C2DM memungkinkan pengembang pihak ketiga untuk menggunakan layanan yang sama seperti yang dilakukan aplikasi Google." dari Android Cloud To Device Messaging
colithium

6

Seperti GTalkyang hilang dari SDK, mungkin ide yang bagus untuk membuat sistem pesan push 'standar'. Dengan begitu, hanya satu layanan yang harus dijalankan, hanya satu koneksi tcp tambahan yang harus dibuka. Aplikasi harus berbicara dengan layanan ini menggunakan Intentsdan terlebih dahulu meminta izin untuk mengirim dan menerima pemberitahuan dari layanan. Layanan kemudian harus memberi tahu pengguna aplikasi yang ingin mengirim dan menerima pesan. Pengguna kemudian akan memberikan atau menolak izin, jadi dia tetap memegang kendali. Aplikasi kemudian akan mendaftarkan kategori tindakan + ke layanan, sehingga layanan tahu bagaimana mengirimkan pesan yang didorong.

Apakah ide yang bagus atau tidak?


6

Mengapa Anda tidak pergi dengan implementasi XMPP. saat ini ada begitu banyak server publik yang tersedia termasuk gtalk, jabber, citadel dll. Untuk Android ada satu SDK yang juga tersedia bernama SMACK. Ini kami tidak bisa mengatakan pemberitahuan push tetapi menggunakan XMPP Anda dapat membuat koneksi tetap terbuka antara klien dan server yang akan memungkinkan komunikasi dua arah. Berarti klien dan server Android keduanya dapat berkomunikasi satu sama lain. Saat ini ini akan memenuhi kebutuhan Push di android. Saya telah menerapkan kode sampel dan ini sangat bagus


Ingin memberikan tautan ke kode sampel Anda? Sudah melakukan pengujian tentang masa pakai baterai?
Alex

Saya telah melakukan pengujian terhadap usia baterai - detak jantung yang Anda perlu kirim setiap enam menit mengurangi masa pakai baterai sebesar 30% dalam kasus terburuk (mis. Perangkat hanya bangun untuk mengirim detak jantung). Dalam kasus terbaik (pengguna menggunakan perangkat untuk browsing, panggilan dll), dampak pada masa pakai baterai dapat diabaikan.
daging

6

Saya baru-baru ini mengembangkan http://pushdroid.org sebuah aplikasi tunggal yang harus diinstal pada ponsel sama seperti google telah menerapkannya di 2.2 ini bekerja dari 1,5 dan disiarkan melalui niat.


4

Masalah dengan GCM adalah bahwa ada banyak konfigurasi yang terlibat dalam proses:

  • Anda harus menambahkan banyak boilerplate ke aplikasi Android Anda
  • Anda perlu mengkonfigurasi server eksternal untuk berkomunikasi dengan server GCM
  • Anda harus menulis tes

Jika Anda menyukai hal-hal sederhana (seperti saya), Anda harus mencoba UrbanAirship . Ini adalah (IMHO) cara termudah untuk menggunakan GCM di aplikasi Anda tanpa melakukan banyak konfigurasi. Ini juga memberi Anda GUI yang cukup untuk menguji apakah pesan GCM Anda dikirim dengan benar.

  • Anda dapat menemukan dokumen dan panduan memulai di sini
  • Anda dapat menemukan contoh aplikasi di sini

Catatan: Saya tidak berafiliasi dengan UrbanAirship dengan cara apa pun



2

Mereka memiliki pendengar yang harus Anda gunakan dengan menggunakan kelas perpustakaan mereka dalam kode Anda. Anda tidak perlu repot-repot mendorong. Anda harus mengirim pesan ke server server akan mendorong pesan ke perangkat. Mereka menggunakan OAuth. Mengenai Protokol, ada dua metode menggunakan CCS dan XMPP. CCS hanya menggunakan XMPP sebagai lapisan transport terautentikasi, sehingga Anda dapat menggunakan sebagian besar pustaka XMPP untuk mengelola koneksi. Untuk mengirim pemberitahuan ke perangkat, Anda dapat menulis kode di aplikasi android untuk dikirim serta kode server Anda. pengiriman pesan hanya akan dilakukan oleh kode Anda. Istirahat akan ditangani oleh Google Server dalam kasus GCM. Anda dapat memeriksa detail di tautan ini

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

Juga, untuk masalah keamanan

keamanan perpesanan Google cloud https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Jika aplikasi Anda tidak berjalan maka perangkat juga dapat menerima pemberitahuan karena Anda harus menulis kode untuk pendengar siaran. Di latar belakang akan mendengarkan server dan setiap kali ada paket pesan akan ada itu menerima pesan sebagai pemberitahuan. Android memiliki layanan yang Anda butuhkan untuk tidak repot tentang hal itu. Anda hanya perlu menggunakan sumber daya tersebut menggunakan kelas pustaka yang membuat pekerjaan Anda lebih mudah dan membiarkan mereka menulis jika aplikasi Anda tidak berjalan maka juga menerima pemberitahuan. Jelas, akan ada beberapa pendengar yang membuat aplikasi untuk menerima. Periksa bagian "Terima pesan" di tautan ini

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

Ini akan menerima permintaan dari pengguna juga. Untuk GCM itu akan dilakukan. Silakan periksa "Kirim pesan"

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.