Push-уведомления в платформе Android


266

Я ищу написать приложение, которое получает push-уведомления от сервера. Я нашел несколько способов сделать это.

  1. SMS - перехватывать входящие SMS и инициировать извлечение с сервера
  2. Периодически опрашивать сервер

У каждого свои ограничения. SMS-нет гарантии по времени прибытия. Опрос может разрядить аккумулятор.

У вас есть лучшее предложение, пожалуйста? Огромное спасибо.


4
Вы также можете смотреть Google I / O 2010 Представление о Push Notification developer.android.com/videos/index.html#v=PLM4LajwDVc
vokilam

Я думаю, что вы можете посмотреть на этот пост: stackoverflow.com/questions/17629942/… С Worklight вы можете получать push-сообщения по различным каналам, включая GCM.
Neeraj Кришна

1
Презентация Google I / O 2010 доступна на youtube.com/watch?v=PLM4LajwDVc
elcuco

«Опрос может разрядить аккумулятор». Вы можете запланировать опрос с AlarmManager, чтобы батарея не сильно разряжалась. Это простое и бесплатное (не нужно платить, как с GCM) решение.
Deepscorn

Ответы:


203

Официальный ответ Google является Android Облако устройств Framework Messaging (устаревшее) Google Cloud Messaging (устаревшее) Firebase Cloud Messaging

Он будет работать на Android> = 2.2 (на телефонах с Play Store).


он сейчас в бета-версии, но вы можете зарегистрироваться в надежде на активацию.
Брэк

3
Как правило, вы можете активироваться очень быстро, и он используется для таких вещей, как GMail, поэтому известно, что он работает в производстве. К сожалению, их пример кода для связи с серверной стороной C2DM отсутствует. Я написал учебник по этому аспекту здесь blog.boxedice.com/2010/10/07/…
Дэвидмитон

6
Проблема в том, что вам нужен аккаунт Google для ваших пользователей, что, я думаю, является ограничением.
кофеин

33
Обратите внимание, что Android Cloud to Device Framework устарела. Новый фреймворк называется Google Cloud Messaging и его можно найти здесь: developer.android.com/guide/google/gcm/index.html
Райан Бергер,

10 апреля 2018 года Google устарел GCM. Серверные и клиентские API GCM были удалены 29 мая 2019 года. Перенесите приложения GCM в Firebase Cloud Messaging (FCM), который наследует надежную и масштабируемую инфраструктуру GCM, а также множество новых функций. Смотрите руководство по миграции, чтобы узнать больше.
Пайего

29

( перекрестная публикация из ответа, который я дал на аналогичный вопрос - поддерживает ли Android пуш-уведомление почти в реальном времени? )

Недавно я начал играть с MQTT http://mqtt.org для Android как способ сделать это (например, push-уведомление, которое не SMS, а управляемая данными, почти немедленная доставка сообщений, не опрос и т. Д.)

У меня есть запись в блоге с дополнительной информацией об этом на случай, если это будет полезно

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

(Примечание: MQTT - это технология IBM, и я должен отметить, что я работаю на IBM.)


Привет Дейл, я прочитал твой пост в блоге о MQTT, и он определенно подходит для почти мгновенного уведомления на мобильных телефонах. Но я не смог найти никакой информации о том, как он на самом деле это делает. Он всегда держит розетку открытой? Как он уведомляет сервер, если его IP-адрес изменился? Был бы признателен, если бы вы могли пролить свет на это. Приветствия Нарен
Нарен

2
Он держит соединение открытым. В последующем посте ( dalelane.co.uk/blog/?p=1009 ) я больше рассказал о последствиях сохранения открытого соединения - вы это видели? Если соединение разорвано, сервер и клиент могут быть уведомлены. Затем решение уровня приложения решает, как реагировать (например, переподключаться). Более подробная информация содержится в документах, упомянутых в посте (например, IA92: www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 pdf на этой странице и Javadoc в zip на этой странице)
dalelane

18

Мое понимание / опыт работы с push-уведомлениями Android:

  1. C2DM GCM - если ваша целевая платформа Android 2.2+, то сделайте это. Только один улов, пользователи устройства должны всегда входить в учетную запись Google, чтобы получать сообщения.

  2. MQTT - подход на основе Pub / Sub, требует активного соединения с устройством, может разряжать батарею, если не реализовано разумно.

  3. Дьякон - Может быть не очень хорошо в долгосрочной перспективе из-за ограниченной поддержки сообщества.

Изменить : Добавлено 25 ноября 2013

GCM - Google говорит ...

Для устройств до версии 3.0 для этого требуется, чтобы пользователи настраивали свою учетную запись Google на своих мобильных устройствах. Учетная запись Google не является обязательной для устройств под управлением Android 4.0.4 или выше. *


Хотя учетная запись Google не требуется для 4.0.4 или более поздней версии, похоже, что вам необходимо установить приложение Google Play. Интересно, как вы устанавливаете это, не имея учетной записи Google.
янв. В

1
@Jan: приложение Google play поставляется с устройством. Пользователю не нужно устанавливать.
Декстер

@Dexter, не на всех устройствах Android по умолчанию установлен Google Play. В большинстве случаев он установлен по умолчанию, особенно на устройствах, которые приобретены у известных производителей телефонов, но устройства, на которых установлена ​​ОС Android, могут не всегда иметь Google Play. (Например, многие эмуляторы Android, такие как новые устройства Genymotion, по умолчанию не имеют Google Play.)
Spencer D

Итак ... Является ли MQTT лучшим вариантом для устройств Android, на которых не установлен Google Play?
Yeung

17

Платформа обмена сообщениями Android Cloud to Device

Важно: C2DM официально объявлен устаревшим с 26 июня 2012 года. Это означает, что C2DM прекратил принимать новых пользователей и запросы квот. Никакие новые функции не будут добавлены в C2DM. Однако приложения, использующие C2DM, продолжат работать. Существующим разработчикам C2DM рекомендуется перейти на новую версию C2DM, которая называется Google Cloud Messaging для Android (GCM). См. Документ Миграция C2DM в GCM для получения дополнительной информации. Разработчики должны использовать GCM для новых разработок.

Пожалуйста, проверьте следующую ссылку:

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


17

Здесь я написал несколько шагов для того, как получить RegID и уведомление, начиная с нуля

  1. Создать / зарегистрировать приложение в Google Cloud
  2. Настройка Cloud SDK с разработкой
  3. Настроить проект для GCM
  4. Получить регистрационный идентификатор устройства
  5. Отправка push-уведомлений
  6. Получать Push-уведомления

Вы можете найти полный учебник в ссылке ниже URL

Начало работы с push-уведомлениями Android: новейшие облачные сообщения Google (GCM) - пошаговое руководство

введите описание изображения здесь

Отсканируйте код, чтобы получить идентификатор регистрации (токен устройства для push-уведомлений).

Настроить проект для GCM


Обновить файл AndroidManifest

Для включения GCM в нашем проекте нам нужно добавить несколько разрешений в наш файл манифеста. Перейдите в AndroidManifest.xml и добавьте ниже код «Добавить разрешение».

<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

добавьте декларацию GCM Broadcast Receiver в тег вашего приложения

<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

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

Получить регистрационный идентификатор (токен устройства для push-уведомлений)

Теперь перейдите к своей деятельности по запуску / всплеску

Добавить константы и переменные класса

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

Примечание : пожалуйста, сохраните REGISTRATION_KEY, это важно для отправки сообщения PN в GCM, также имейте в виду, что это будет уникальным для всех устройств, при использовании этого только GCM будет отправлять Push-уведомления.

Получать Push-уведомления

Добавить GCM Broadcast Receiver Class

Так как мы уже объявили «GcmBroadcastReceiver.java» в нашем файле манифеста, давайте создадим этот код класса получателя обновления класса следующим образом.

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

Так как мы уже объявили «GcmBroadcastReceiver.java» в нашем файле манифеста, давайте создадим этот код класса получателя обновления класса следующим образом.

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 ты проверил ссылку с полным уроком. Также, пожалуйста, дайте мне знать, что не хватает, я обновлю ответ.
swiftBoy

11

Существует новая попытка с открытым исходным кодом разработать библиотеку Java для push-уведомлений на Android на основе веб-сервера Meteor. Вы можете проверить это в блоге проекта Deacon , где вы найдете ссылки на Meteor и репозиторий проекта GitHub. Нам нужны разработчики, поэтому, пожалуйста, распространите информацию!


9

Вы можете использовать Xtify ( http://developer.xtify.com ) - у них есть веб-сервис push-уведомлений, который работает с их SDK. Это бесплатно и до сих пор, это работало очень хорошо для меня.


3
Я получил ответ от их вице-президента, который сказал, что нет никаких планов когда-либо взимать плату за услугу push. Это довольно удивительный SDK.
Кроу Т. Робот

8

или....

3) Поддерживайте соединение с сервером, каждые несколько минут отправляйте сообщения об активности, и сервер может мгновенно отправлять сообщения. Так работает Gmail, Google Talk и т. Д.


5
Я думаю, что это, к сожалению, приведет к изрядному количеству разряда батареи. Если вы выберете этот маршрут, не забудьте ограничить время, в течение которого вы это делаете.
haseman

Нет, на самом деле, это не так, потому что простаивающие соединения TCP / IP практически не потребляют энергию сотового модема.
Исаак Уоллер

На самом деле, это займет много времени, так что вы правы. Также очень помогает отправка сообщений с большими интервалами.
Исаак Уоллер

Каковы "длинные интервалы" в этом отношении? Я знаю, что gmail push работает таким образом, но я не знаю, какие интервалы времени ожидания они используют.
Тобсен

Я нашел это изображение о батареях Тяговой производительности против Пушей: labs.ericsson.com/files/battery.jpg я взял его из Ericsson Push API здесь: labs.ericsson.com/apis/mobile-java-push/documentation
Menda

6

Я рекомендую использовать GCM - Google Cloud Messaging для Android. Это бесплатно, а для простого использования это должно быть очень просто.

Однако для отправки уведомлений от вашего имени требуется сторонний сервер. Если вы хотите избежать очень хороших промышленных решений для службы push-уведомлений Android:

  • Urban Airship - бесплатно до 1М уведомлений в месяц, после чего вы будете платить за 1000 уведомлений
  • PushApps - бесплатно за 1М уведомлений в месяц и безлимитных уведомлений за 19,99 в месяц
  • PushWoosh - бесплатно для устройств 1M, премиальные планы от 39 евро

Diclaimer - я работаю в PushApps и использую их продукт в своих приложениях уже более года.


6

По состоянию на 18.05.2016 Firebase - это унифицированная платформа Google для мобильных разработчиков, включая push-уведомления.


4

Боюсь, вы нашли оба возможных метода. Google, по крайней мере на начальном этапе, собирался реализовать API GChat, который вы могли бы использовать для реализации push / pull. К сожалению, эта библиотека была вырезана под Android 1.0.


1
Они обещали вернуть его, как только проблемы с безопасностью будут решены ... если это когда-нибудь случится.
Джереми Логан

3

Я не знаю, если это все еще полезно. Я достиг чего-то подобного с библиотекой Java на http://www.pushlets.com/

Althoug, делающий это в сервисе, не будет препятствовать тому, чтобы андроид выключил это, убивая поток слушателя.



2

C2DM: пользователи вашего приложения должны иметь учетную запись gmail.

MQTT: когда ваше соединение достигнет 1024, оно прекратит работу из-за того, что использовал «выбранную модель» linux.

Существует бесплатный сервис push и api для android, вы можете попробовать его: http://push-notification.org


2

Бесплатный и простой метод:

Если ваша целевая база пользователей невелика (менее 1000) и вы хотите начать с бесплатного сервиса, тогда Airbop - лучший и самый удобный.

Сайт Airbop. Он использует сервис Google Cloud Messaging через свой API и обеспечивает хорошую производительность. Я использовал его для двух своих проектов, и его было легко реализовать.

Такие сервисы, как и Urbanship, превосходны, но обеспечивают весь стек развертывания, а не только функцию push-уведомлений.

Если ваша цель - только push-сервис, Airbop будет работать нормально.

Я не использовал Pushwoosh , но это также отличный выбор. Это позволяет пушить до 1 000 000 устройств бесплатно


1

Я бы предложил использовать как SMS, так и HTTP. Если пользователь не вошел в систему, отправьте на его телефон SMS-сообщение, чтобы уведомить его, что сообщение ожидает.

Вот как работает этот сервис Ericsson Labs: https://labs.ericsson.com/apis/mobile-java-push/

Если вы реализуете это самостоятельно, сложно удалить входящее SMS, чтобы пользователь не увидел его. Или, может быть, это нормально, если они увидят это в вашем случае.

Похоже, это работает: Удаление SMS с помощью BroadCastReceiver - Android

Да, написание такого кода может быть опасным, и вы можете испортить чью-то жизнь, потому что ваше приложение удалило SMS, которого не должно было быть.


1
LOL: «Да, написание такого кода может быть опасным, и вы можете испортить чью-то жизнь, потому что ваше приложение удалило SMS, которого оно не должно было иметь». голос за это. ржунимагу.
Кумар Рави

Ссылка на Mobile Java Push не работает, и сама служба устарела.
NAXA

1

Вы можете использовать Google Cloud Messaging или GCM , это бесплатно и просто в использовании. Также вы можете использовать сторонние push-серверы, такие как PushWoosh, что дает вам больше гибкости


1

Есть много сторонних серверов, таких как Urban Airship , Xtify, Mainline , ... которые позволяют отправлять сообщения не только на Android, но и на iOS, Windows Phone ...


1

Firebase Cloud Messaging (FCM) - это новая версия GCM. FCM - это кроссплатформенное решение для обмена сообщениями, которое позволяет отправлять сообщения безопасно и бесплатно. Наследует центральную инфраструктуру GCM для надежной доставки сообщений на Android, iOS, в Интернете (javascript), Unity и C ++.

По состоянию на 10 апреля 2018 года Google отклонил GCM. API сервера и клиента GCM устарели и будут удалены 11 апреля 2019 года. Google рекомендует перенести приложения GCM в Firebase Cloud Messaging (FCM), который наследует надежную и масштабируемую инфраструктуру GCM.

Ресурс


0

Вы можете использовать Pusher

Это размещенный сервис, который позволяет очень просто добавлять данные и функции в реальном времени в веб-приложения и мобильные приложения.
Pusher предлагает библиотеки для интеграции во все основные среды выполнения и фреймворки.

PHP, Ruby, Python, Java, .NET, Go and Nodeна сервере
JavaScript, Objective-C (iOS) and Java (Android)на клиенте.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.