Добавление 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.
Создание проекта с поддержкой Firebase Cloud Messaging
Войдите в консоль Firebase. Создайте проект Firebase, если его еще нет.
После создания проекта выберите Add Firebase to your Android app (Добавить Firebase в приложение Android).
Выполните следующие действия на странице Add Firebase to your Android app (Добавление Firebase в приложение Android):
Для Имя пакета Android скопируйте свое значение applicationId в файл приложения build.gradle. В нашем примере он выглядит следующим образом:
com.fabrikam.fcmtutorial1app
.Выберите Регистрация приложения.
Выберите Download google-services.json (Загрузить google-services.json), сохраните файл в папку приложения проекта, а затем выберите Далее.
Внесите следующие изменения конфигурации в проект в Android Studio.
В файл build.gradle уровня проекта (<project>/build.gradle) добавьте следующий текст в раздел зависимости.
classpath 'com.google.gms:google-services:4.0.1'
В файле 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'
Добавьте следующую строку в конец файла build.gradle уровня приложения после раздела с зависимостями.
apply plugin: 'com.google.gms.google-services'
На панели инструментов щелкните Синхронизировать сейчас.
Выберите Далее.
Выберите Пропустить этот шаг.
В консоли Firebase щелкните значок шестеренки возле имени проекта. Выберите пункт Project Settings (Параметры проекта).
Если вы еще не скачали файл google-services.json в папку app проекта Android Studio, это можно сделать на этой странице.
Переключитесь на вкладку Обмен сообщениями в облаке в верхней части.
Скопируйте и сохраните Ключ сервера для последующего использования. Это значение используется для настройки имени центра.
Настройка центра уведомлений
Компонент мобильных приложений в службе приложений Azure использует Центры уведомлений Azure для отправки push-уведомлений, поэтому вам нужно настроить центр уведомлений для мобильного приложения.
На портале Azure щелкните Службы приложений, а затем выберите серверную часть приложения. В разделе Параметры выберите Push.
Чтобы добавить в приложение ресурс концентратора уведомлений, нажмите кнопку Подключить. Вы можете создать центр или подключиться к существующему.
Теперь центр уведомлений подключен к серверной части проекта вашего мобильного приложения. Позднее вы настроите этот концентратор уведомлений, чтобы подключиться к системе отправки уведомлений платформы (PNS), которая отправляет push-уведомления на устройства.
Настройка Azure для отправки push-уведомлений
На портале Azure щелкните Просмотреть все>Службы приложений, а затем выберите серверную часть своего мобильного приложения. В разделе Параметры щелкните App Service Push (Push-уведомления службы приложений) и выберите имя центра уведомлений.
Выберите Google (GCM), введите значение ключа сервера, полученное от Firebase в ходе предыдущей процедуры, и нажмите кнопку Сохранить.
Теперь серверная часть вашего мобильного приложения настроена для использования Firebase Cloud Messaging. Это позволяет отправлять push-уведомления приложению Android через центр уведомлений.
Включение push-уведомлений для серверного проекта
Используйте процедуру, соответствующую типу проекта серверной части ( серверную часть .NET или Node.js серверную часть.
Серверный проект .NET
В Visual Studio щелкните правой кнопкой мыши серверный проект, выберите пункт Управление пакетами NuGet. Найдите
Microsoft.Azure.NotificationHubs
и нажмите кнопку Установить. Будет установлена клиентская библиотека центров уведомлений.Разверните папку "Контроллеры", откройте файл TodoItemController.cs и добавьте следующие операторы
using
:using Microsoft.Azure.Mobile.Server.Config; using Microsoft.Azure.NotificationHubs;
Замените метод
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); }
Повторная публикация серверного проекта
Серверный проект Node.js
Настройте внутренний проект.
Замените существующий код в файле 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.
При редактировании этого файла на локальном компьютере повторно опубликуйте серверный проект.
Добавление 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 загруженного проекта. Чтобы проверить версию, внесите следующие изменения:
В Android Studio щелкните Tools>Android>SDK Manager. Если вы не установили последнюю версию платформы SDK, щелкните ее для установки. Запишите номер версии.
На вкладке Обозреватель проектов в разделе 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 в проект
В Android Studio выберитеструктуру проектафайла>. Щелкните Notifications (Уведомления), выберите Firebase Cloud Messaging и нажмите кнопку OK.
Добавление кода
В проекте приложения откройте файл
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>
Откройте файл
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();
Добавьте новый класс для обработки уведомлений. В обозревателе проектов откройте приложение>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()); } } }
Добавьте еще один класс, который будет обрабатывать изменения токена. Создайте класс 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. Узнайте, как добавить в приложение поддержку автономной работы с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные, даже если сетевого подключения нет.