Android Platformunda Anında Bildirimler


266

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

  1. SMS - Gelen SMS'i durdurun ve sunucudan bir çekme işlemi başlatın
  2. Sunucuyu düzenli olarak yokla

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

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


4
Ayrıca Google I / O 2010 Sunumunu Push Notification hakkında izleyebilirsiniz developer.android.com/videos/index.html#v=PLM4LajwDVc
vokilam

Sanırım bu gönderiye bakabilirsiniz: stackoverflow.com/questions/17629942/… Worklight ile GCM dahil farklı kanallardan push alabilirsiniz.
Neeraj Krishna

1
Google I / O 2010 sunumu youtube.com/watch?v=PLM4LajwDVc
elcuco

"Anket pili tüketebilir." AlarmManager ile anketi karıştırabilirsiniz, böylece pil çok fazla boşalmaz. Basit ve ücretsiz (GCM'de olduğu gibi ödemeye gerek yok) çözümü.
Deepscorn

Yanıtlar:


203

Google'ın resmi yanıtı Android Cloud to Device Messaging Framework (kullanımdan kaldırıldı) Google Cloud Messaging (kullanımdan kaldırıldı) Firebase Cloud Messaging

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


şu anda beta sürümündedir, ancak etkinleştirilme umuduyla kaydolabilirsiniz.
Brack

3
Genellikle çok hızlı bir şekilde aktif hale gelebilirsiniz ve GMail gibi şeyler için kullanılıyor, bu yüzden üretimde çalışmayı biliyor. Ne yazık ki C2DM'nin sunucu tarafı yönü ile iletişim kurmak için örnek kodları eksik. Burada bu yönü için bir öğretici yazdım blog.boxedice.com/2010/10/07/...
DavidM

6
Sorun, kullanıcılarınız için bir Google hesabına ihtiyacınız olması: yani bir kısıtlama.
kaffein

33
Android Cloud'dan Cihaza Mesajlaşma Çerçevesinin kullanımdan kaldırıldığını unutmayın. Yeni çerçeveye Google Cloud Messaging denir ve burada bulunabilir: developer.android.com/guide/google/gcm/index.html
Ryan Berger

10 Nisan 2018'de Google, GCM'yi kullanımdan kaldırdı. GCM sunucusu ve istemci API'ları 29 Mayıs 2019'da kaldırıldı. GCM uygulamalarını, güvenilir ve ölçeklenebilir GCM altyapısını ve birçok yeni özelliği devralan Firebase Cloud Messaging'e (FCM) taşıyın. Daha fazla bilgi için taşıma kılavuzuna bakın.
paiego

29

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

Yakın zamanda bu tür bir şey yapmanın bir yolu olarak Android için MQTT http://mqtt.org ile oynamaya başladım (yani SMS değil veri odaklı, neredeyse anında mesaj teslimi, yoklama vb.)

Yararlı olması durumunda arka plan bilgileri içeren bir blog yayınım var

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

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


Merhaba Dale, MQTT hakkında blog yazınızı okudum ve kesinlikle cep telefonlarına neredeyse anında bildirim için tasarıyı uygun görünüyor. Ama bunun gerçekte nasıl yapıldığına dair herhangi bir bilgi bulamadım. Bir soketi her zaman açık tutar mı? IP adresi değiştiyse sunucuyu nasıl bilgilendirir? Bu konuda biraz ışık tutabilirseniz çok sevinirim. Şerefe Naren
Naren

2
Bir bağlantı açık tutulur. Bir takip gönderisinde ( dalelane.co.uk/blog/?p=1009 ) Bir bağlantıyı açık tutmanın etkileri hakkında daha fazla konuştum - bunu gördün mü? Bağlantı kesilirse, hem sunucuya hem de istemciye bildirim gönderilebilir. Ardından, nasıl yanıt vereceğine karar vermek (örneğin yeniden bağlanmak) bir uygulama katmanı kararı. Yayında belirtilen dokümanlarda daha fazla bilgi var (örneğin IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 pdf ve bu sayfadaki zip'te Javadoc)
dalelane

18

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

  1. C2DM GCM - Hedef android platformunuz 2.2+ ise, bunun için gidin. Sadece bir yakalama, cihaz kullanıcılarınınmesajları almak içinher zaman bir Google Hesabı ile giriş yapmaları gerekir.

  2. MQTT - Pub / Sub tabanlı yaklaşım, cihazdan aktif bir bağlantıya ihtiyaç duyar, makul bir şekilde uygulanmazsa pili tüketebilir.

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

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

GCM - Google diyor ki ...

3.0 öncesi cihazlarda bu, kullanıcıların Google hesaplarını mobil cihazlarında kurmalarını gerektirir. Android 4.0.4 veya sonraki sürümlerini çalıştıran cihazlarda Google hesabı gerekmez. *


Bir Google hesabı 4.0.4 veya üstü için gerekli olmasa da, Google Play uygulamasının yüklü olmasını gerektirir. Bir Google hesabınız olmadan bunu nasıl yüklediğinizi merak ediyorum.
Ocak

1
@Jan: Google Play uygulaması cihazla birlikte gelir. Kullanıcının yüklemesine gerek yoktur.
Dexter

@Dexter, varsayılan olarak tüm Android cihazlarda Google Play yüklü değildir. Çoğu, varsayılan olarak yüklüdür, özellikle saygın telefon satıcılarından satın alınan cihazlar, ancak yalnızca Android işletim sisteminin yanıp sönen cihazlarda her zaman Google Play olmayabilir. (Örneğin, yeni Genymotion cihazları gibi birçok Android emülatöründe varsayılan olarak Google Play yoktur.)
Spencer D

Öyleyse ... MQTT, Google Play yüklü olmayan Android cihazlar için en iyi seçenek midir?
Yeung

17

Android Buluttan Cihaza Mesajlaşma Çerçevesi

Önemli: C2DM, 26 Haziran 2012 tarihinden itibaren resmen 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 Android için Google Cloud Messaging (GCM) adı verilen yeni C2DM sürümüne geçmeleri önerilir. Daha fazla bilgi için C2DM'den GCM'ye Taşıma 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

Burada sıfırdan başlayarak RegID ve Bildirim Nasıl Alınır için 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 Kayıt Kimliğini Al
  5. Anlık Bildirimler Gönder
  6. Anlık Bildirimler Alın

Eğiticinin tamamını aşağıdaki URL bağlantısında bulabilirsiniz

Android Anında Bildirim'e Başlarken: En Yeni Google Cloud Messaging (GCM) - adım adım eksiksiz öğretici

resim açıklamasını buraya girin

Kayıt Kimliğini almak için kod snip (Push Bildirimi için Cihaz Simgesi).

GCM için projeyi yapılandırma


AndroidManifest dosyasını güncelleme

Projemizde GCM'yi etkinleştirmek için manifest dosyamıza az sayıda 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 etiketinize GCM Yayın Alıcısı bildirimi ekleyin

<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 bildirimi ekle

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

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

Şimdi Lansman / Sıçrama 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üncelleme

@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 : Lütfen REGISTRATION_KEY'i saklayın, PN Mesajını GCM'ye göndermek için önemlidir, ayrıca mayında saklayın bu tüm cihaz için benzersiz olacak, bunu kullanarak sadece GCM Push Bildirimi gönderecektir.

Anlık Bildirimler Alın

GCM Yayın Alıcı Sınıfı Ekle

Manifest dosyamızda zaten “GcmBroadcastReceiver.java” ilan ettiğimiz için, bu sınıf güncelleme alıcısı sınıf kodunu bu şekilde oluşturalım

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” ilan ettiğimiz için, bu sınıf güncelleme alıcısı sınıf kodunu bu şekilde oluşturalım

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, öğreticinin tamamını içeren bağlantıyı kontrol ettiniz . ayrıca neyin eksik olduğunu bana bildirin Cevabı güncelleyeceğim.
swiftBoy

11

Meteor web sunucusunu temel alan Android'de anında iletme bildirimleri için bir Java kitaplığı geliştirmek için yeni bir açık kaynak çabası vardır. Meteor'a ve projenin GitHub deposuna bağlantılar bulabileceğiniz Deacon Project Blogundan kontrol edebilirsiniz . Geliştiricilere ihtiyacımız var, bu yüzden lütfen kelimeyi yayınlayın!


9

Xtify'yi kullanabilirsiniz ( http://developer.xtify.com ) - SDK'larıyla çalışan bir push bildirimleri web servisine sahiptirler. ücretsiz ve şimdiye kadar benim için gerçekten iyi çalıştı.


3
VP'den itme servisi için herhangi bir ücretlendirme planı olmadığını söyleyen bir yanıt aldım. Oldukça şaşırtıcı bir SDK.
Crowe T. Robot

8

veya....

3) Sunucuyla bağlantıyı sürdürün, birkaç dakikada bir canlı tutma gönderin ve sunucu iletileri anında iletebilir. Gmail, Google Talk vb. Bu şekilde çalışır.


5
Bunun ne yazık ki ağır miktarda pil tüketmesine neden olacağını düşünüyorum. Bu rotayı kullanırsanız, bunu yaptığınız süreyi sınırladığınızdan emin olun.
haseman

Hayır, aslında olmaz, çünkü boş TCP / IP bağlantıları hücre modemi üzerinde neredeyse hiç güç almaz.
Isaac Waller

Aslında, zaman içinde çok şey alacak, bu yüzden haklısın. Canlı aralıklarla uzun aralıklarla göndermek de çok yardımcı olur.
Isaac Waller

Bu konuda "uzun aralıklar" nedir? Gmail push'un bu şekilde çalıştığını biliyorum, ancak hangi zaman aşımı aralıklarını kullandıklarını bilmiyorum.
tobsen

Pil performansı hakkında bu resmi buldum Pull vs Push: labs.ericsson.com/files/battery.jpg Burada Ericsson Push API'sinden aldım
Menda

6

GCM - Android için Google Cloud Messaging'i kullanmanızı öneririm Ücretsizdir ve basit kullanımlar için çok kolay olmalıdır.

Ancak, bildirimleri sizin adınıza göndermek için 3. taraf bir sunucu bulundurmanız gerekir. Android push bildirimleri hizmeti için bazı çok iyi endüstriyel çözümler olduğundan kaçınmak istiyorsanız:

  • Urban Airship - ayda en fazla 1 milyon bildirim ücretsiz, daha sonra 1000 bildirim başına ücretlendirilirsiniz
  • PushApps - ayda 1 milyon bildirim için ücretsiz ve ayda 19,99 için sınırsız bildirim
  • PushWoosh - 1M cihazlar için ücretsiz, premium planlar 39 EURO'dan başlayan fiyatlarla

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


6

18/05/2016 tarihi itibariyle Firebase , push bildirimleri de dahil olmak üzere Google'ın mobil geliştiriciler için birleşik platformudur.


4

Korkarım her iki olası yöntemi de buldunuz. Google, en azından başlangıçta, bir push / pull uygulaması için kullanabileceğiniz bir GChat API uygulayacaktı. Ne yazık ki, bu kütüphane Android 1.0 tarafından kesildi.


1
Güvenlik sorunları çözüldükten sonra geri getireceğine söz verdiler.
Jeremy Logan

3

Bunun hala faydalı olup olmadığını bilmiyorum. Http://www.pushlets.com/ adresindeki java kitaplığıyla böyle bir şey başardım.

Bir hizmette Althoug, android'in dinleyici iş parçacığını öldürerek onu kapatmasını engellemez.



2

C2DM: uygulama kullanıcılarınızın gmail hesabı olmalıdır.

MQTT: bağlantınız 1024'e ulaştığında, linux'un "model seç" i kullandığından çalışmayı durduracaktır.

Android için ücretsiz bir push servisi ve api var, deneyebilirsiniz: http://push-notification.org


2

Ücretsiz ve kolay yöntem:

Hedef kullanıcı tabanınız büyük değilse (1000'den az) ve ücretsiz bir hizmetle başlamak istiyorsanız, Airbop en iyi ve en uygun olanıdır.

Airbop Web Sitesi API'sı aracılığıyla Google Cloud Messaging hizmetini kullanır ve iyi bir performans sağlar. iki projem için kullandım ve uygulaması kolay oldu.

Urbanship gibi hizmetler mükemmeldir, ancak yalnızca push bildirimleri şeyi değil, tüm bir dağıtım yığını sağlar.

Hedefiniz yalnızca itme hizmeti ise, Airbop iyi çalışır.

Ben kullanmadıysanız Pushwoosh , aynı zamanda mükemmel bir seçimdir. Ücretsiz 1.000.000 cihaza aktarmaya izin verir


1

Hem SMS hem de HTTP kullanmanızı öneririm. Eğer kullanıcı oturum açmamışsa, telefonuna mesaj göndermek için bir SMS gönderin. Bekleyen bir mesaj var.

Ericsson Labs hizmeti şu şekilde çalışır: https://labs.ericsson.com/apis/mobile-java-push/

Bunu kendiniz uygularsanız, zor kısım gelen SMS'i kullanıcı görmeden siler. Ya da belki senin durumunda görürlerse sorun olmaz.

Şöyle görünüyor: BroadCastReceiver Kullanarak SMS Silme - Android

Evet, böyle bir kod yazmak tehlikeli olabilir ve uygulamanızın olmaması gereken bir SMS'i sildiğinden birinin hayatını mahvedebilirsiniz.


1
lol: "Evet, böyle kod yazmak tehlikeli olabilir ve uygulamanızın olmaması gereken bir SMS'i sildiğinden birinin hayatını mahvedebilirsiniz." bunun için oy verin. lol.
Kumar Ravi

Mobile Java Push bağlantısı kesildi ve hizmetin kendisi kullanımdan kaldırılmış görünüyor.
naXa



1

Firebase Cloud Messaging (FCM), GCM'nin yeni sürümüdür. FCM, güvenli ve ücretsiz mesaj göndermenizi sağlayan platformlar arası bir mesajlaşma çözümüdür. Android, iOS, Web (javascript), Unity ve C ++ 'da güvenilir mesajlar iletmek için GCM'nin merkezi altyapısını devralır.

10 Nisan 2018 itibarıyla Google, GCM'yi onaylamadı. GCM sunucusu ve istemci API'ları kullanımdan kaldırıldı ve 11 Nisan 2019'da kaldırılacak. Google, GCM uygulamalarının güvenilir ve ölçeklenebilir GCM altyapısını devralan Firebase Bulut Mesajlaşma'ya (FCM) taşınmasını önerir.

Kaynak


0

İtici kullanabilirsiniz

Web ve mobil uygulamalara gerçek zamanlı veri ve işlevsellik eklemeyi süper kolaylaştıran, barındırılan bir hizmettir.
İtici, tüm ana çalışma zamanlarına ve çerçevelerine entegre olmak için kütüphaneler sunar.

PHP, Ruby, Python, Java, .NET, Go and Node
JavaScript, Objective-C (iOS) and Java (Android)istemcideki sunucuda .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.