Поделиться через


Добавление 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 package name (Имя пакета 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) добавьте в раздел dependencies следующий текст.

      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) для отправки на устройства.

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

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

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

    Задайте ключ API на портале

Серверная часть мобильных приложений теперь настроена для использования Firebase Cloud Messaging. Это позволяет отправлять push-уведомления в приложение, работающее на устройстве Android, с помощью концентратора уведомлений.

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

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

Проект бэкенд .NET

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

  2. В папке Controllers откройте 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

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

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

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

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

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

  2. На вкладке обозревателя проектов в разделе скрипты Gradleоткройте файл build.gradle (модуль: приложение). Убедитесь, что для compileSdkVersion и targetSdkVersion установлена последняя версия SDK. build.gradle может выглядеть следующим образом:

    android {
        compileSdkVersion 26
        defaultConfig {
            targetSdkVersion 26
        }
    }
    

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

Если вы тестируете на старом устройстве, обратитесь к Добавление Firebase в ваш проект Android, чтобы определить, насколько низким можно задать это значение, и установите его соответствующим образом.

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

  1. добавить Firebase в проект Android

  2. В Android Studio выберите файл>структура проекта. Выберите уведомления, выберите Firebase Cloud Messaging, а затем нажмите ОК.

Добавить код

  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 com.google.firebase.iid.FirebaseInstanceId;
      
    • Измените определение MobileServiceClient с частного на частный статический, чтобы это выглядело следующим образом.

      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. В поле "Имя" введите 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. Узнайте, как добавить автономную поддержку в приложение с помощью серверной части мобильных приложений. При автономной синхронизации пользователи могут взаимодействовать с мобильным приложением — просматривать, добавлять или изменять данные, даже если сетевое подключение отсутствует.