Pemberitahuan Push di Platform Android


266

Saya mencari untuk menulis aplikasi yang menerima peringatan push dari server. Saya menemukan beberapa metode untuk melakukan ini.

  1. SMS - Mencegah SMS yang masuk dan memulai tarikan dari server
  2. Polling server secara berkala

Masing-masing memiliki keterbatasan sendiri. SMS- tidak ada jaminan pada waktu kedatangan. Polling dapat menguras baterai.

Apakah Anda punya saran yang lebih baik? Terima kasih banyak.


4
Anda juga dapat menonton Presentasi Google I / O 2010 tentang Push Notification developer.android.com/videos/index.html#v=PLM4LajwDVc
vokilam

Saya pikir Anda dapat melihat posting ini: stackoverflow.com/questions/17629942/... Dengan Worklight Anda dapat menerima dorongan melalui saluran yang berbeda termasuk GCM.
Neeraj Krishna

1
Presentasi Google I / O 2010 tersedia di youtube.com/watch?v=PLM4LajwDVc
elcuco

"Polling bisa menguras baterai." Anda dapat menjadwalkan polling dengan AlarmManager, sehingga baterai tidak terkuras berat. Ini solusi sederhana dan gratis (tidak perlu membayar, seperti dengan GCM).
Deepscorn

memiliki masalah yang sama stackoverflow.com/questions/35812304/…
albert

Jawaban:


203

Jawaban resmi Google adalah Kerangka Kerja Pesan Cloud Android ke Perangkat (tidak digunakan) Google Cloud Messaging (tidak digunakan) Firebase Cloud Messaging

Ini akan bekerja di Android> = 2.2 (pada ponsel yang memiliki Play Store).


ini masih dalam versi beta sekarang, tetapi Anda dapat mendaftar dengan harapan dapat diaktifkan.
brack

3
Anda biasanya dapat diaktifkan dengan sangat cepat, dan sedang digunakan untuk hal-hal seperti GMail, jadi ketahui untuk bekerja di produksi. Sayangnya kode sampel mereka untuk berkomunikasi dengan aspek sisi server C2DM masih kurang. Saya telah menulis tutorial untuk aspek itu di sini blog.boxedice.com/2010/10/07/...
davidmytton

6
Masalahnya adalah Anda memerlukan akun Google untuk pengguna Anda: yang, menurut saya, merupakan kendala.
kaffein

33
Perhatikan bahwa Kerangka Kerja Pesan Cloud Android ke Perangkat telah usang. Kerangka kerja baru ini disebut Google Cloud Messaging dan dapat ditemukan di sini: developer.android.com/guide/google/gcm/index.html
Ryan Berger

Pada 10 April 2018, Google mencabut GCM. Server dan klien GCM API dihapus pada 29 Mei 2019. Migrasikan aplikasi GCM ke Firebase Cloud Messaging (FCM), yang mewarisi infrastruktur GCM yang andal dan dapat diukur, ditambah banyak fitur baru. Lihat panduan migrasi untuk mempelajari lebih lanjut.
paiego

29

( posting silang dari jawaban yang saya berikan ke pertanyaan serupa - Apakah Android mendukung pemberitahuan push waktu dekat? )

Saya baru-baru ini mulai bermain dengan MQTT http://mqtt.org untuk Android sebagai cara melakukan hal semacam ini (yaitu push notification yang bukan SMS tetapi didorong data, pengiriman pesan yang hampir seketika, tidak polling, dll.)

Saya memiliki posting blog dengan informasi latar belakang tentang hal ini jika itu membantu

http://dalelane.co.uk/blog/?p=938

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


Halo Dale, saya membaca posting blog Anda tentang MQTT dan tampaknya sesuai dengan tagihan untuk notifikasi hampir instan di ponsel. Tetapi saya belum dapat menemukan informasi tentang bagaimana sebenarnya melakukannya. Apakah soket tetap terbuka setiap saat? Bagaimana cara memberitahu server jika alamat ip-nya telah berubah? Akan sangat menghargai jika Anda bisa menjelaskan ini. Cheers Naren
Naren

2
Itu membuat koneksi terbuka. Dalam posting tindak lanjut ( dalelane.co.uk/blog/?p=1009 ) saya memang berbicara lebih banyak tentang implikasi memegang koneksi terbuka - apakah Anda melihat itu? Jika koneksi terputus, baik server dan klien dapat diberitahu. Maka itu adalah keputusan lapisan aplikasi untuk memutuskan bagaimana merespons (mis. Menghubungkan kembali). Ada informasi lebih lanjut dalam dokumen yang disebut dalam pos (mis. IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 pdf di halaman itu, dan Javadoc di zip di halaman itu)
dalelane

18

Pemahaman / pengalaman saya dengan pemberitahuan push Android adalah:

  1. C2DM GCM - Jika platform Android target Anda adalah 2.2+, maka lakukanlah. Hanya satu tangkapan, pengguna perangkat harus selalu login dengan Akun Google untuk mendapatkan pesan.

  2. MQTT - Pendekatan berbasis Pub / Sub, membutuhkan koneksi aktif dari perangkat, dapat menguras baterai jika tidak diimplementasikan dengan bijaksana.

  3. Diakon - Mungkin tidak baik dalam jangka panjang karena dukungan komunitas yang terbatas.

Sunting : Ditambahkan pada 25 November 2013

GCM - Google mengatakan ...

Untuk perangkat pra-3.0, ini mengharuskan pengguna untuk mengatur akun Google mereka di perangkat seluler mereka. Akun Google bukan persyaratan pada perangkat yang menjalankan Android 4.0.4 atau lebih tinggi. *


Meskipun akun Google tidak diperlukan untuk 4.0.4 atau lebih tinggi, tampaknya mengharuskan Anda untuk menginstal aplikasi Google Play. Saya ingin tahu bagaimana Anda menginstalnya tanpa memiliki akun Google.
Jan

1
@ Jan: Aplikasi Google play terpasang dengan perangkat. Pengguna tidak perlu menginstal.
Dexter

@Dexter, tidak semua perangkat Android memasang Google Play secara default. Sebagian besar sudah diinstal secara default, terutama perangkat yang dibeli dari vendor telepon terkemuka, tetapi perangkat yang hanya memiliki OS Android yang di-flash ke mereka mungkin tidak selalu memiliki Google Play. (Misalnya, banyak emulator Android, seperti perangkat Genymotion baru, tidak memiliki Google Play secara default.)
Spencer D

Jadi ... Apakah MQTT pilihan terbaik untuk perangkat Android yang tidak menginstal Google Play?
Yeung

17

Android Cloud to Device Framework Messaging

Penting: C2DM telah secara resmi ditinggalkan pada 26 Juni 2012. Ini berarti bahwa C2DM telah berhenti menerima pengguna baru dan permintaan kuota. Tidak ada fitur baru yang akan ditambahkan ke C2DM. Namun, aplikasi yang menggunakan C2DM akan terus berfungsi. Pengembang C2DM yang ada didorong untuk bermigrasi ke versi baru C2DM, yang disebut Google Cloud Messaging for Android (GCM). Lihat dokumen Migrasi C2DM-ke-GCM untuk informasi lebih lanjut. Pengembang harus menggunakan GCM untuk pengembangan baru.

Silakan periksa tautan berikut:

http://developer.android.com/guide/google/gcm/index.html


17

Di sini saya telah menulis beberapa langkah untuk Cara Mendapatkan RegID dan Pemberitahuan mulai dari awal

  1. Buat / Daftarkan Aplikasi di Google Cloud
  2. Atur Cloud SDK dengan Pengembangan
  3. Konfigurasikan proyek untuk GCM
  4. Dapatkan ID Pendaftaran Perangkat
  5. Kirim Pemberitahuan Push
  6. Terima Pemberitahuan Push

Anda dapat menemukan tutorial lengkap di tautan URL di bawah ini

Memulai dengan Android Push Notification: Google Cloud Messaging (GCM) terbaru - tutorial langkah demi langkah lengkap

masukkan deskripsi gambar di sini

Kode snip untuk mendapatkan ID Registrasi (Token Perangkat untuk Push Notification).

Konfigurasikan proyek untuk GCM


Perbarui file AndroidManifest

Untuk mengaktifkan GCM di proyek kami, kami perlu menambahkan beberapa izin dalam file manifes kami Buka AndroidManifest.xml dan tambahkan kode di bawah ini Tambahkan Izin

<uses-permission android:name="android.permission.INTERNET”/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="android.permission.VIBRATE" />

<uses-permission android:name=“.permission.RECEIVE" />
<uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

Tambahkan deklarasi Penerima Siaran GCM

tambahkan deklarasi Penerima Siaran GCM di tag aplikasi Anda

<application
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="" />
            </intent-filter]]>

        </receiver]]>
     
<application/>

Tambahkan deklarasi Layanan GCM

<application
     <service android:name=".GcmIntentService" />
<application/>

Dapatkan ID Pendaftaran (Token Perangkat untuk Pemberitahuan Push)

Sekarang Buka Aktivitas Peluncuran / Percikan Anda

Tambahkan Konstanta dan Variabel Kelas

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

Perbarui metode OnCreate dan OnResume

@Override
protected void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_launch);
     context = getApplicationContext();
         if (checkPlayServices()) 
     {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);

            if (regid.isEmpty())
            {
                registerInBackground();
            }
            else
            {
            Log.d(TAG, "No valid Google Play Services APK found.");
            }
      }
 }

@Override protected void onResume()
{
       super.onResume();       checkPlayServices();
}


# Implement GCM Required methods (Add below methods in LaunchActivity)

private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.d(TAG, "This device is not supported - Google Play Services.");
                finish();
            }
            return false;
        }
        return true;
 }

private String getRegistrationId(Context context) 
{
   final SharedPreferences prefs = getGCMPreferences(context);
   String registrationId = prefs.getString(PROPERTY_REG_ID, "");
   if (registrationId.isEmpty()) {
       Log.d(TAG, "Registration ID not found.");
       return "";
   }
   int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
   int currentVersion = getAppVersion(context);
   if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) 
{
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
                Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) 
{
     try 
     {
         PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
      } 
      catch (NameNotFoundException e) 
      {
            throw new RuntimeException("Could not get package name: " + e);
      }
}


private void registerInBackground() 
{     new AsyncTask() {
     Override
     protected Object doInBackground(Object... params) 
     {
          String msg = "";
          try 
          {
               if (gcm == null) 
               {
                        gcm = GoogleCloudMessaging.getInstance(context);
               }
               regid = gcm.register(SENDER_ID);               Log.d(TAG, "########################################");
               Log.d(TAG, "Current Device's Registration ID is: "+msg);     
          } 
          catch (IOException ex) 
          {
              msg = "Error :" + ex.getMessage();
          }
          return null;
     }     protected void onPostExecute(Object result) 
     { //to do here };
  }.execute(null, null, null);
}

Catatan : harap simpan REGISTRATION_KEY, penting untuk mengirim Pesan PN ke GCM juga tetap milik saya ini akan unik untuk semua perangkat, dengan menggunakan ini hanya GCM akan mengirimkan Pemberitahuan Push.

Terima Pemberitahuan Push

Tambahkan Kelas Penerima Siaran GCM

Seperti yang telah kita nyatakan "GcmBroadcastReceiver.java" dalam file Manifest kita, Jadi mari kita buat kelas ini memperbarui kode kelas penerima dengan cara ini

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) 
    {        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
        Toast.makeText(context, wow!! received new push notification", Toast.LENGTH_LONG).show();
    }
}

Tambahkan Kelas Layanan GCM

Seperti yang telah kita nyatakan "GcmBroadcastReceiver.java" dalam file Manifest kita, Jadi mari kita buat kelas ini memperbarui kode kelas penerima dengan cara ini

public class GcmIntentService extends IntentService
{     public static final int NOTIFICATION_ID = 1;     private NotificationManager mNotificationManager;     private final static String TAG = "GcmIntentService";     public GcmIntentService() {
     super("GcmIntentService");     
     }     @Override
     protected void onHandleIntent(Intent intent) {
          Bundle extras = intent.getExtras();
          Log.d(TAG, "Notification Data Json :" + extras.getString("message"));

          GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
          String messageType = gcm.getMessageType(intent);          if (!extras.isEmpty()) {          if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR
               .equals(messageType)) {
               sendNotification("Send error: " + extras.toString());
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
          .equals(messageType)) {
          sendNotification("Deleted messages on server: "
          + extras.toString());          // If it's a regular GCM message, do some work.
          } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE
          .equals(messageType)) {
          // This loop represents the service doing some work.
          for (int i = 0; i < 5; i++) {
               Log.d(TAG," Working... " + (i + 1) + "/5 @ "
               + SystemClock.elapsedRealtime());               try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
               }
             }
             Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
             sendNotification(extras.getString("message"));
           }
        }        // Release the wake lock provided by the WakefulBroadcastReceiver.
        GcmBroadcastReceiver.completeWakefulIntent(intent);
     }     // Put the message into a notification and post it.
     // This is just one simple example of what you might choose to do with
     // a GCM message.
     private void sendNotification(String msg) {          mNotificationManager = (NotificationManager) this
          .getSystemService(Context.NOTIFICATION_SERVICE);
          PendingIntent contentIntent = PendingIntent.getActivity(this, 0,          new Intent(this, LaunchActivity.class), 0);

          NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(          this)
          .setSmallIcon(R.drawable.icon)
          .setContentTitle("Ocutag Snap")
          .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
          .setContentText(msg)
          .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);

          mBuilder.setContentIntent(contentIntent);          mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
     }
}

@Rohit apakah Anda memeriksa tautan yang memiliki tutorial lengkap. juga tolong beri tahu saya apa yang hilang saya akan memperbarui jawabannya.
swiftBoy

11

Ada upaya open-source baru untuk mengembangkan perpustakaan Java untuk pemberitahuan push pada Android berdasarkan server web Meteor. Anda dapat memeriksanya di Deacon Project Blog , di mana Anda akan menemukan tautan ke Meteor dan repositori GitHub proyek. Kami membutuhkan pengembang, jadi tolong sebarkan berita ini!


9

Anda dapat menggunakan Xtify ( http://developer.xtify.com ) - mereka memiliki layanan web push notification yang berfungsi dengan SDK mereka. ini gratis dan sejauh ini, bekerja dengan sangat baik untuk saya.


3
Saya mendapat tanggapan dari VP mereka yang mengatakan bahwa tidak ada rencana untuk mengisi ulang untuk layanan push. Ini SDK yang luar biasa.
Crowe T. Robot

8

atau....

3) Menjaga koneksi ke server, mengirim keep-alives setiap beberapa menit, dan server dapat mendorong pesan secara instan. Ini adalah cara kerja Gmail, Google Talk, dll.


5
Saya pikir ini akan, sayangnya, menghasilkan jumlah baterai yang cukup besar. JIKA Anda mengambil rute ini, pastikan untuk membatasi jumlah waktu Anda melakukan ini.
haseman

Tidak, sebenarnya, itu tidak akan terjadi, karena koneksi TCP / IP yang menganggur hampir tidak memerlukan daya pada modem sel.
Isaac Waller

Sebenarnya, ini akan memakan banyak waktu, jadi Anda benar. Mengirim barang tetap dengan interval panjang sangat membantu juga.
Isaac Waller

Apa "interval panjang" dalam hal ini? Saya tahu push gmail berfungsi seperti ini tetapi saya tidak tahu interval waktu habis apa yang mereka gunakan.
tobsen

Saya menemukan gambar ini tentang kinerja baterai Pull vs Push: labs.ericsson.com/files/battery.jpg Saya mengambilnya dari Ericsson Push API di sini: labs.ericsson.com/apis/mobile-java-push/documentation
Menda

6

Saya sarankan menggunakan GCM - Google Cloud Messaging untuk Android Gratis, dan untuk penggunaan sederhana itu harus sangat mudah.

Namun itu diperlukan untuk mempertahankan server pihak ke-3 untuk mengirim pemberitahuan atas nama Anda. Jika Anda ingin menghindari itu ada beberapa solusi industri yang sangat baik untuk layanan pemberitahuan push Android:

  • Urban Airship - gratis hingga 1 juta notifikasi per bulan, setelah itu Anda dikenakan biaya per 1000 notifikasi
  • PushApps - gratis untuk notifikasi 1M per bulan, dan notifikasi tidak terbatas untuk 19,99 per bulan
  • PushWoosh - gratis untuk perangkat 1M, paket premium mulai dari 39 EURO

Diclaimer - Saya bekerja di PushApps dan juga menggunakan produk mereka di aplikasi saya selama lebih dari satu tahun sekarang.



4

Saya khawatir Anda telah menemukan kedua metode yang mungkin. Google, setidaknya pada awalnya, akan mengimplementasikan api GChat yang dapat Anda gunakan untuk implementasi push / pull. Sayangnya, perpustakaan itu dipotong oleh Android 1.0.


1
Mereka berjanji untuk mengembalikannya setelah masalah keamanan diselesaikan ... jika itu pernah terjadi.
Jeremy Logan

3

Saya tidak tahu apakah ini masih berguna. Saya mencapai sesuatu seperti ini dengan perpustakaan java di http://www.pushlets.com/

Meskipun melakukannya dalam layanan tidak akan mencegah android mematikannya dan mematikan utas pendengar.



2

C2DM: pengguna aplikasi Anda harus memiliki akun gmail.

MQTT: ketika koneksi Anda mencapai 1024, itu akan berhenti bekerja karena menggunakan "pilih model" dari linux.

Ada layanan push dan api gratis untuk android, Anda dapat mencobanya: http://push-notification.org


2

Metode gratis dan mudah:

Jika basis pengguna target Anda tidak besar (kurang dari 1000) dan Anda ingin layanan gratis untuk memulai, maka Airbop adalah yang terbaik dan paling nyaman.

Situs Web Airbop Menggunakan layanan Google Cloud Messaging melalui API-nya dan memberikan kinerja yang baik. Saya telah menggunakannya untuk dua proyek saya dan mudah mengimplementasikannya.

Layanan seperti dan Urbanship sangat baik tetapi menyediakan seluruh penempatan penyebaran dan bukan hanya hal pemberitahuan push.

Jika hanya layanan push yang menjadi target Anda, Airbop akan berfungsi dengan baik.

Saya belum pernah menggunakan Pushwoosh , tetapi juga merupakan pilihan yang bagus. Ini memungkinkan push ke 1.000.000 perangkat gratis


1

Saya sarankan menggunakan SMS dan HTTP. Jika pengguna tidak masuk, kirim SMS ke telepon mereka untuk memberi tahu mereka. Ada pesan yang menunggu.

Begitulah cara layanan Lab Ericsson ini berfungsi: https://labs.ericsson.com/apis/mobile-java-push/

Jika Anda menerapkannya sendiri, bagian yang sulit adalah menghapus SMS yang masuk tanpa pengguna melihatnya. Atau mungkin tidak apa-apa jika mereka melihatnya dalam kasus Anda.

Sepertinya ini berfungsi: Menghapus SMS Menggunakan BroadCastReceiver - Android

Ya, menulis kode seperti ini bisa berbahaya dan Anda berpotensi merusak kehidupan seseorang karena aplikasi Anda menghapus SMS yang seharusnya tidak ada.


1
lol: "Ya, menulis kode seperti ini bisa berbahaya dan Anda berpotensi merusak kehidupan seseorang karena aplikasi Anda menghapus SMS yang seharusnya tidak ada." pilih untuk itu. lol.
Kumar Ravi

Tautan ke Mobile Java Push sudah mati, dan layanan itu sendiri tampaknya sudah usang.
naXa

1

Anda dapat menggunakan Google Cloud Messaging atau GCM , gratis dan mudah digunakan. Anda juga dapat menggunakan server dorong pihak ketiga seperti PushWoosh yang memberi Anda lebih banyak fleksibilitas



1

Firebase Cloud Messaging (FCM) adalah versi baru GCM. FCM adalah solusi perpesanan lintas platform yang memungkinkan Anda mengirim pesan dengan aman dan gratis. Mewarisi infrastruktur pusat GCM untuk mengirimkan pesan dengan andal di Android, iOS, Web (javascript), Unity dan C ++.

Pada 10 April 2018, Google tidak menyetujui GCM. Server GCM dan API klien tidak digunakan lagi dan akan dihapus pada 11 April 2019. Google merekomendasikan migrasi aplikasi GCM ke Firebase Cloud Messaging (FCM), yang mewarisi infrastruktur GCM yang andal dan dapat diskalakan.

Sumber


0

Anda bisa menggunakan Pusher

Ini adalah layanan yang dihosting yang membuatnya sangat mudah untuk menambahkan data real-time dan fungsionalitas ke aplikasi web dan seluler.
Pusher menawarkan perpustakaan untuk diintegrasikan ke dalam semua runtime utama dan kerangka kerja.

PHP, Ruby, Python, Java, .NET, Go and Nodedi server
JavaScript, Objective-C (iOS) and Java (Android)pada klien.

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.