Soru Android Platformunda Push Bildirimleri


Bir sunucudan gelen uyarılar alan bir uygulama yazmak istiyorum. Bunu yapmak için birkaç yöntem buldum.

  1. SMS - Gelen SMS'i engelleyin ve sunucudan bir çekme başlatın
  2. Sunucuyu periyodik olarak yokla

Her birinin kendi sınırlamaları vardır. SMS-varış zamanında garanti yoktur. Anket pili boşaltabilir.

Daha iyi bir öneriniz var mı lütfen? Çok teşekkürler.


255
2017-09-04 11:25


Menşei


Push Bildirimi ile ilgili Google I / O 2010 Sunumunu da izleyebilirsiniz. developer.android.com/videos/index.html#v=PLM4LajwDVc - vokilam
Bu yazıya bakabileceğinizi düşünüyorum: stackoverflow.com/questions/17629942/...Worklight ile GCM dahil olmak üzere farklı kanallardan push gönderebilirsiniz. - Neeraj Krishna
Google I / O 2010 sunumu şu adreste mevcuttur: youtube.com/watch?v=PLM4LajwDVc - elcuco
"Anket bataryayı boşaltabilir." Anketi AlarmManager ile aktarabilirsiniz, bu nedenle batarya ağır drene olmaz. Bu basit ve ücretsiz (GCM ile olduğu gibi ödeme yapmaya gerek yok). - Deepscorn
aynı sorunu var stackoverflow.com/questions/35812304/... - albert


Cevaplar:


Google’ın resmi cevabı Android Cloud Cihaz Mesajlaşma Çerçevesi (Kaldırıldı)  Google Cloud Mesajlaşma(Kaldırıldı)  Firebase Cloud Messaging

Android> = 2.2'de (Play Store'a sahip olan telefonlarda) çalışacaktır.


199
2017-08-02 07:54



Şu an beta sürümü var, ancak aktif olmanın umuduyla kayıt olabilirsiniz. - brack
Genelde çok hızlı bir şekilde devreye girebilir ve GMail gibi şeyler için kullanıldığından üretimde çalışmayı bilirsiniz. Ne yazık ki, onların C2DM sunucu tarafı ile iletişim için örnek kodları eksiktir. Bu açıdan bu konuda bir eğitim yazdım blog.boxedice.com/2010/10/07/... - DavidM
@Vinod lütfen bunu doğru cevap olarak kabul edin, böylece sonuçların en üstünde görünecektir. Kesinlikle geleceğe gitmek için bir yol! - Micah Hainline
Sorun, kullanıcılarınız için bir Google hesabına ihtiyacınız olmasıdır: bence, bir kısıtlama. - kaffein
Android Cloud to Device Messaging Framework uygulamasının kullanımdan kaldırıldığını unutmayın. Yeni çerçeve Google Cloud Messaging olarak adlandırılıyor ve burada bulunabilir: developer.android.com/guide/google/gcm/index.html - Ryan Berger


(benzer bir soruya verdiğim cevaptan çapraz gönderme Android gerçek zamanlı push bildirimini destekliyor mu? )

Geçenlerde MQTT ile oynamaya başladım http://mqtt.org Bu tür bir şey yapmanın bir yolu olarak Android için (ör. SMS olmayan, ancak veri odaklı, neredeyse anında mesaj gönderimi, yoklama değil, push bildirimi)

Bu konuda yardımcı olacak bir blog yazısı var.

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

(Not: MQTT bir IBM teknolojisidir ve IBM için çalıştığımı belirtmeliyim.)


29
2017-09-30 22:59



Merhaba Dale, MQTT hakkında blog yayınınızı okudum ve cep telefonlarında neredeyse anında bildirim için faturaya uyuyor gibi görünüyor. Ama aslında nasıl yaptığına dair hiçbir bilgi bulamadım. Soketi her zaman açık tutuyor mu? IP adresi değiştiyse sunucuyu nasıl bilgilendirir? Bu konuda biraz ışık tutabilirseniz sevinirim. Şerefe Naren - Naren
Açık bir bağlantı var. Bir takip yazısında (dalelane.co.uk/blog/?p=1009) Bağlantıyı açık tutmanın sonuçları hakkında daha fazla konuştum - bunu gördünüz mü? Bağlantı kesilirse, hem sunucu hem de istemci bilgilendirilebilir. Ardından, nasıl yanıt verileceğine karar vermek için bir uygulama katmanı kararı (örn. Yeniden bağlanma). Gönderide belirtilen dokümanlarda daha fazla bilgi vardır (ör. IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 Bu sayfada pdf ve bu sayfadaki zip içinde Javadoc) - dalelane
Hayır, o yazılarına rastlamadım. Sorularımın çoğunu yanıtladı. Çok teşekkür ederim :) - Naren
rsmb kullanarak mqtt üzerinde kaç müşteri olabilir merak ettiniz mi? - Mikey
yardıma ihtiyacım var stackoverflow.com/questions/35812304/... - albert


Android Cloud Cihaz Mesajlaşma Çerçevesi

Önemli: C2DM, 26 Haziran 2012 itibariyle resmi olarak kullanımdan kaldırılmıştır. Bu, C2DM'nin yeni kullanıcıları ve kota isteklerini kabul etmeyi durdurduğu anlamına gelir. C2DM'ye yeni özellikler eklenmeyecek. Ancak, C2DM kullanan uygulamalar çalışmaya devam edecektir. Mevcut C2DM geliştiricilerinin, Google Cloud Messaging for Android (GCM) adlı yeni C2DM sürümüne geçmeleri teşvik ediliyor. Daha fazla bilgi için C2DM-GCM Geçiş belgesine bakın. Geliştiriciler yeni geliştirme için GCM'yi kullanmalıdır.

Lütfen aşağıdaki bağlantıyı kontrol edin:

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


17
2017-07-04 08:39





Burada sıfırdan başlayarak RegID ve Bildirim Nasıl Yapılır hakkında birkaç adım yazdım

  1. Google Cloud’da Uygulama Oluştur / Kaydet
  2. Cloud SDK'yı Geliştirme ile Kurma
  3. GCM için projeyi yapılandırma
  4. Cihaz Kaydı Kimliği Al
  5. Push Bildirimleri Gönder
  6. Push Bildirimleri Al

Tam eğiticiyi aşağıdaki URL bağlantısında bulabilirsiniz

Android Push Bildirimi ile Başlarken: Son Google Cloud   Mesajlaşma (GCM) - adım adım eğitici

enter image description here

Kod, Kayıt Kimliği (Push Bildirimi için Cihaz Jetonu) almak için yanıp söner.

GCM için projeyi yapılandırma 


AndroidManifest dosyasını güncelle

GCM'yi projemizde etkinleştirmek için bildirim dosyamıza birkaç izin eklememiz gerekiyor AndroidManifest.xml adresine gidin ve aşağıdaki kodu ekleyin İzin ekle

<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" />

GCM Yayın Alıcısı bildirimi ekle

uygulama etiketinizde GCM Yayın Alıcı bildirimi ekle

<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/>

GCM Servie bildirimini ekle

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

Kayıt Kimliği Al (Push Bildirimi için Cihaz Jetonu)

Şimdi Launch / Splash Etkinliğinize gidin 

Sabitler ve Sınıf Değişkenleri Ekleme

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;

OnCreate ve OnResume yöntemlerini güncelle

@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);
}

Not : REGISTRATION_KEY'i saklayın, lütfen GCM'ye PN Mesajı göndermek için önemlidir Ayrıca benim tüm bu cihaz için benzersiz olacak, bu sadece GCM Push Bildirimi gönderecektir kullanarak.

Push Bildirimleri Al

GCM Yayın Alıcısı Sınıfı Ekleme

Manifest dosyamızda zaten “GcmBroadcastReceiver.java” olduğunu belirttiğimiz için, bu sınıfı yaratalım alıcı sınıf kodunu bu şekilde güncelle

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();
    }
}

GCM Hizmet Sınıfı ekle

Manifest dosyamızda zaten “GcmBroadcastReceiver.java” olduğunu belirttiğimiz için, bu sınıfı yaratalım alıcı sınıf kodunu bu şekilde güncelle

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());
     }
}

17
2017-11-29 06:33



bir kısmı eksik - Rohit
@Rohit kontrol ettin mi bağlantı tam eğitime sahip olmak. ayrıca neyin eksik olduğunu bana bildirin lütfen cevabı güncelleyeceğim. - swiftBoy


Android push bildirimi ile ilgili anlayışım / deneyimim:

  1. C2DM  GCM - Hedef android platformunuz 2.2+ ise, o zaman bunun için gidin. Sadece bir yakalama, cihaz kullanıcıları her zaman olmak zorunda bir Google Hesabı ile giriş yapmış mesajları almak için

  2. MQTT - Pub / Sub tabanlı yaklaşım, cihazdan aktif bir bağlantıya ihtiyaç duyar, hassas bir şekilde uygulanmadığında pili boşaltabilir.

  3. diyakoz - Sınırlı topluluk desteği nedeniyle uzun vadede iyi olmayabilir.

Düzenle: 25 Kasım 2013'te eklendi

GCM - Google diyor ki ...

3.0 öncesi cihazlar için, bu kullanıcıların Google hesaplarını mobil cihazlarında kurmasını gerektirir. Android 4.0.4 veya sonraki sürümünü çalıştıran cihazlarda bir Google hesabı şart değildir. *


17
2018-03-04 10:38



Bir Google hesabı 4.0.4 veya üstü için gerekli olmasa da, Google Play uygulamasının yüklü olmasını gerektirir. Google hesabı olmadan nasıl yüklediğinizi merak ediyorum. - Jan
@Jan: Google play uygulaması cihazla birlikte gelir. Kullanıcının yüklemesine gerek yoktur. - Dexter
@Dexter, tüm Android cihazlarda varsayılan olarak Google Play yüklü değildir. Çoğu varsayılan olarak, özellikle saygın telefon satıcılarından satın alınan cihazlara sahiptir, ancak Android işletim sistemine sahip olan cihazların her zaman Google Play'e sahip olamayacağı durumlar olabilir. (Örneğin, yeni Genymotion cihazları gibi birçok Android emülatörünün varsayılan olarak Google Play'i yoktur.) - SpencerD
Yani ... MQTT, Google Play'in yüklü olmadığı Android cihazlar için en iyi seçenek mi? - Yeung


Android'de Meteor web sunucusuna dayalı push bildirimleri için bir Java kütüphanesi geliştirmek için yeni bir açık kaynak çalışması var. Kontrol edebilirsiniz Deacon Proje BloğuMeteor'a ve projenin GitHub deposuna bağlantılar bulacağınız yer. Geliştiricilere ihtiyacımız var, bu yüzden lütfen kelimeyi yaymayın!


11
2018-04-17 02:46





Xtify'ı kullanabilirsinizhttp://developer.xtify.com) - SDK'larıyla çalışan push bildirimleri web servisine sahipler. ücretsiz ve şimdiye kadar, benim için gerçekten iyi çalıştı.


9
2018-03-18 22:47



VP'lerinden, push servisi için herhangi bir ödeme yapılmasının planlanmadığını belirten bir yanıt aldım. Oldukça inanılmaz bir SDK. - Crowe T. Robot


veya....

3) Sunucuyla bağlantı kurun, her birkaç dakikada bir canlılık gönderin ve sunucu anında mesaj gönderebilir. Gmail, Google Talk, vb. İşte böyle çalışır.


8
2017-09-04 22:20



Bunun ne yazık ki, bol miktarda pil boşalması üreteceğini düşünüyorum. Bu rotayı alırsanız, bunu yaptığınız süreyi sınırladığınızdan emin olun. - haseman
Hayır, aslında, öyle değil, çünkü boşta kalan TCP / IP bağlantıları hücre modemi üzerinde neredeyse hiç güç almıyor. - Isaac Waller
Aslında, zamanla çok zaman alacaktır, bu yüzden haklısınız. Uzun aralıklarla canlı tutmak, çok yardımcı olur. - Isaac Waller
Ah! Kafam karıştı, hatalı mıyım yoksa haklı mıyım? ;-) - haseman
Haklısın, benim hatamdı. - Isaac Waller


Kullanmanı öneririm GCM - Android için Google Cloud Mesajlaşma Bu ücretsiz ve basit kullanımlar için çok kolay olmalı.

Bununla birlikte, sizin adınıza bildirimleri göndermek için bir üçüncü taraf sunucusunun bakımını gerektirir. Android push bildirimleri hizmeti için bazı çok iyi endüstriyel çözümler olduğundan kaçınmak istiyorsanız:

  • Kentsel Zeplin - Ayda 1M'ye kadar bildirim, daha sonra 1000 bildirim için ücretlendirilirsiniz
  • PushApps - Aylık 1M bildirimler ve aylık 19.99 için sınırsız bildirim
  • PushWoosh - 1M cihazlar için ücretsiz, premium planlar 39 EURO'dan

Diclaimer - PushApps'ta çalışıyorum ve ürünlerini bir yıldan fazla bir süredir kullanıyorum.


6
2018-04-20 10:55