Добавление push-уведомлений в приложение Android

Обзор

В этом учебнике мы добавим push-уведомления в ознакомительный проект для платформы Android, чтобы при каждом добавлении новой записи на устройство отправлялось push-уведомление.

Если вы не используете скачанный проект сервера, необходимо добавить пакет расширений для push-уведомлений. Дополнительные сведения см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.

Предварительные требования

Кроме этого, вам потребуются:

  • Интегрированная среда разработки, в зависимости от серверной части вашего проекта:

    • Android Studio — если это приложение имеет серверную часть Node.js.
    • Visual Studio Community 2013 или более поздняя версия — если это приложение имеет серверную часть Microsoft .NET.
  • Android 2.3 или более поздняя версия, репозиторий Google версии 27 или более поздняя версия и службы Google Play 9.0.2 или более поздняя версия для Firebase Cloud Messaging.

  • Изучение ознакомительный проект для платформы Android.

Создание проекта с поддержкой Firebase Cloud Messaging

  1. Войдите в консоль Firebase. Создайте проект Firebase, если его еще нет.

  2. После создания проекта выберите Add Firebase to your Android app (Добавить Firebase в приложение Android).

    Добавление Firebase в приложение Android

  3. Выполните следующие действия на странице Add Firebase to your Android app (Добавление Firebase в приложение Android):

    1. Для Имя пакета Android скопируйте свое значение applicationId в файл приложения build.gradle. В нашем примере он выглядит следующим образом: com.fabrikam.fcmtutorial1app.

      Указание имени пакета.

    2. Выберите Регистрация приложения.

  4. Выберите Download google-services.json (Загрузить google-services.json), сохраните файл в папку приложения проекта, а затем выберите Далее.

    Загрузка файла google-services.json.

  5. Внесите следующие изменения конфигурации в проект в Android Studio.

    1. В файл build.gradle уровня проекта (<project>/build.gradle) добавьте следующий текст в раздел зависимости.

      classpath 'com.google.gms:google-services:4.0.1'
      
    2. В файле build.gradle уровня приложения (<project>/<app-module>/build.gradle) в раздел зависимостей добавьте следующий текст.

      implementation 'com.google.firebase:firebase-core:16.0.8'
      implementation 'com.google.firebase:firebase-messaging:17.3.4'
      
    3. Добавьте следующую строку в конец файла build.gradle уровня приложения после раздела с зависимостями.

      apply plugin: 'com.google.gms.google-services'
      
    4. На панели инструментов щелкните Синхронизировать сейчас.

      Изменения конфигурации build.gradle.

  6. Выберите Далее.

  7. Выберите Пропустить этот шаг.

    Пропуск последнего шага.

  8. В консоли Firebase щелкните значок шестеренки возле имени проекта. Выберите пункт Project Settings (Параметры проекта).

    Выбор параметров проекта

  9. Если вы еще не скачали файл google-services.json в папку app проекта Android Studio, это можно сделать на этой странице.

  10. Переключитесь на вкладку Обмен сообщениями в облаке в верхней части.

  11. Скопируйте и сохраните Ключ сервера для последующего использования. Это значение используется для настройки имени центра.

Настройка центра уведомлений

Компонент мобильных приложений в службе приложений Azure использует Центры уведомлений Azure для отправки push-уведомлений, поэтому вам нужно настроить центр уведомлений для мобильного приложения.

  1. На портале Azure щелкните Службы приложений, а затем выберите серверную часть приложения. В разделе Параметры выберите Push.

  2. Чтобы добавить в приложение ресурс концентратора уведомлений, нажмите кнопку Подключить. Вы можете создать центр или подключиться к существующему.

    Настройка концентратора

Теперь центр уведомлений подключен к серверной части проекта вашего мобильного приложения. Позднее вы настроите этот концентратор уведомлений, чтобы подключиться к системе отправки уведомлений платформы (PNS), которая отправляет push-уведомления на устройства.

Настройка Azure для отправки push-уведомлений

  1. На портале Azure щелкните Просмотреть все>Службы приложений, а затем выберите серверную часть своего мобильного приложения. В разделе Параметры щелкните App Service Push (Push-уведомления службы приложений) и выберите имя центра уведомлений.

  2. Выберите Google (GCM), введите значение ключа сервера, полученное от Firebase в ходе предыдущей процедуры, и нажмите кнопку Сохранить.

    Указание ключа API на портале

Теперь серверная часть вашего мобильного приложения настроена для использования Firebase Cloud Messaging. Это позволяет отправлять push-уведомления приложению Android через центр уведомлений.

Включение push-уведомлений для серверного проекта

Используйте процедуру, соответствующую типу проекта серверной части ( серверную часть .NET или Node.js серверную часть.

Серверный проект .NET

  1. В Visual Studio щелкните правой кнопкой мыши серверный проект, выберите пункт Управление пакетами NuGet. Найдите Microsoft.Azure.NotificationHubs и нажмите кнопку Установить. Будет установлена клиентская библиотека центров уведомлений.

  2. Разверните папку "Контроллеры", откройте файл TodoItemController.cs и добавьте следующие операторы using :

    using Microsoft.Azure.Mobile.Server.Config;
    using Microsoft.Azure.NotificationHubs;
    
  3. Замените метод PostTodoItem следующим кодом:

    public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
    {
        TodoItem current = await InsertAsync(item);
        // Get the settings for the server project.
        HttpConfiguration config = this.Configuration;
    
        MobileAppSettingsDictionary settings =
            this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
        // Get the Notification Hubs credentials for the Mobile App.
        string notificationHubName = settings.NotificationHubName;
        string notificationHubConnection = settings
            .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
        // Create a new Notification Hub client.
        NotificationHubClient hub = NotificationHubClient
        .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
        // Android payload
        var androidNotificationPayload = "{ \"data\" : {\"message\":\"" + item.Text + "\"}}";
    
        try
        {
            // Send the push notification and log the results.
            var result = await hub.SendGcmNativeNotificationAsync(androidNotificationPayload);
    
            // Write the success result to the logs.
            config.Services.GetTraceWriter().Info(result.State.ToString());
        }
        catch (System.Exception ex)
        {
            // Write the failure result to the logs.
            config.Services.GetTraceWriter()
                .Error(ex.Message, null, "Push.SendAsync Error");
        }
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }
    
  4. Повторная публикация серверного проекта

Серверный проект Node.js

  1. Настройте внутренний проект.

  2. Замените существующий код в файле todoitem.js следующим кодом:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs
    logger.info('Running TodoItem.insert');
    
    // Define the GCM payload.
    var payload = {
        "data": {
            "message": context.item.text
        }
    };
    
    // Execute the insert.  The insert returns the results as a Promise,
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured
            if (context.push) {
                // Send a GCM native notification.
                context.push.gcm.send(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute()
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;
    

    При вставке нового элемента todo отправляется уведомление GCM, содержащее item.text.

  3. При редактировании этого файла на локальном компьютере повторно опубликуйте серверный проект.

Добавление push-уведомлений в приложение

В этом разделе мы обновим клиентское приложение Android для обработки push-уведомлений.

Проверка версии пакета SDK для Android

Из-за постоянной ведущейся разработки версия пакета Android SDK, установленная в Android Studio, может не совпадать с версией в коде. В этом руководстве используется пакет SDK для Android версии 26 (последней на момент написания руководства). Номер версии может увеличиваться по мере выпуска новых пакетов SDK, и мы рекомендуем использовать новейшую доступную версию.

Два признака несоответствия версии:

  • При выполнении сборке или перестроении проекта может появиться сообщение об ошибке Gradle, например Gradle sync failed: Failed to find target with hash string 'android-XX'.
  • Стандартные объекты Android в коде, которые должны разрешаться на основе инструкций import , могут создавать сообщения об ошибках.

Если появляется любой из этих признаков, версия пакета Android SDK, установленная в Android Studio, может не соответствовать целевому SDK загруженного проекта. Чтобы проверить версию, внесите следующие изменения:

  1. В Android Studio щелкните Tools>Android>SDK Manager. Если вы не установили последнюю версию платформы SDK, щелкните ее для установки. Запишите номер версии.

  2. На вкладке Обозреватель проектов в разделе Gradle Scripts (Сценарии Gradle) откройте файл build.gradle (Module: app). Для параметров compileSdkVersion и targetSdkVersion задайте самую последнюю установленную версию пакета SDK. build.gradle может выглядеть следующим образом.

    android {
        compileSdkVersion 26
        defaultConfig {
            targetSdkVersion 26
        }
    }
    

Далее следует установить службы Google Play. Firebase Cloud Messaging предъявляет некоторые требования к минимальному уровню API для разработки и тестирования, которым должно удовлетворять свойство minSdkVersion в манифесте.

Если вы тестируете приложение на более старом устройстве, обратитесь к руководству Add Firebase to Your Android Project (Добавление Firebase в проект Android), чтобы определить, насколько малым можно задать это значение.

Добавление Firebase Cloud Messaging в проект

  1. Добавление Firebase в проект Android

  2. В Android Studio выберитеструктуру проектафайла>. Щелкните Notifications (Уведомления), выберите Firebase Cloud Messaging и нажмите кнопку OK.

Добавление кода

  1. В проекте приложения откройте файл AndroidManifest.xml. Добавьте следующий код после открывающего тега application :

    <service android:name=".ToDoMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service android:name=".ToDoInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>
    
  2. Откройте файл ToDoActivity.java и внесите в него следующие изменения:

    • Добавьте оператор import.

      import com.google.firebase.iid.FirebaseInstanceId;
      
    • Измените определение объекта MobileServiceClient с private на private static.

      private static MobileServiceClient mClient;
      
    • Добавьте метод registerPush.

      public static void registerPush() {
          final String token = FirebaseInstanceId.getInstance().getToken();
          if (token != null) {
              new AsyncTask<Void, Void, Void>() {
                  protected Void doInBackground(Void... params) {
                      mClient.getPush().register(token);
                      return null;
                  }
              }.execute();
          }
      }
      
    • Измените метод onCreate класса ToDoActivity. После создания экземпляра MobileServiceClient обязательно добавьте следующий код:

      registerPush();
      
  3. Добавьте новый класс для обработки уведомлений. В обозревателе проектов откройте приложение>java>узлов пространства имен проекта и щелкните правой кнопкой мыши узел имени пакета. Выберите Создать и Java Class (Класс Java). В поле "Имя" введите ToDoMessagingService и нажмите кнопку "ОК". Замените объявление класса следующим кодом:

    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    
    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class ToDoMessagingService extends FirebaseMessagingService {
    
        private static final int NOTIFICATION_ID = 1;
    
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            String message = remoteMessage.getData().get("message");
            if (message != null) {
                sendNotification("Notification Hub Demo", message);
            }
        }
    
        private void sendNotification(String title, String messageBody) {
            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, ToDoActivity.class), 0);
            Notification.Builder notificationBuilder = new Notification.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(title)
                    .setContentText(messageBody)
                    .setContentIntent(contentIntent);
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (notificationManager != null) {
                notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
            }
        }
    }
    
  4. Добавьте еще один класс, который будет обрабатывать изменения токена. Создайте класс Java ToDoInstanceIdService и замените объявление класса следующим кодом:

    import com.google.firebase.iid.FirebaseInstanceIdService;
    
    public class ToDoInstanceIdService extends FirebaseInstanceIdService {
    
        @Override
        public void onTokenRefresh() {
            ToDoActivity.registerPush();
        }
    }
    

Ваше приложение теперь обновлено для поддержки push-уведомлений.

Тестирование приложения с помощью опубликованной мобильной службы

Приложение можно проверить, подключив телефон Android напрямую с помощью USB-кабеля или используя виртуальное устройство в эмуляторе.

Дальнейшие действия

Вы изучили это руководство и теперь можете перейти к ознакомлению с одной из следующих тем.

  • Добавьте проверку подлинности в приложение Android. Узнайте, как добавить аутентификацию в проект быстрого запуска ToDoList для Android с помощью поддерживаемого поставщика удостоверений.
  • Включение автономной синхронизации для приложения Android. Узнайте, как добавить в приложение поддержку автономной работы с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные, даже если сетевого подключения нет.