Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Обзор
В этом руководстве вы добавите push-уведомления в проект краткого руководства Xamarin.Android, чтобы push-уведомление отправлялось на устройство каждый раз, когда вставляется запись.
Если вы не используете скачанный проект сервера быстрого запуска, вам потребуется пакет расширения push-уведомлений. Дополнительные сведения см. в руководстве Работа с пакетным серверным SDK для .NET для мобильных приложений Azure.
Предпосылки
Для работы с этим руководством требуется настройка:
- Активная учетная запись Google. Вы можете создать учетную запись Google на accounts.google.com.
- клиентский компонент Google Cloud Messaging.
Настройка центра уведомлений
Функция мобильных приложений Службы приложений Azure использует Центр уведомлений Azure для отправки push-уведомлений, поэтому вам нужно настроить центр уведомлений для вашего мобильного приложения.
На портале Azureперейдите к службам приложений, а затем выберите серверную часть вашего приложения. В разделе Параметрывыберите Push.
Чтобы добавить ресурс концентратора уведомлений в приложение, выберите Подключиться. Вы можете создать концентратор или подключиться к существующему.
Теперь вы подключили центр уведомлений к внутреннему проекту мобильных приложений. Позже вы настроите этот центр уведомлений для подключения к системе уведомлений платформы (PNS) для отправки на устройства.
Включить Firebase Cloud Messaging
Войдите в консоль Firebase. Создайте проект Firebase, если его еще нет.
После создания проекта выберите Add Firebase to your Android app (Добавить Firebase в приложение Android).
Выполните следующие действия на странице Add Firebase to your Android app (Добавление Firebase в приложение Android):
Для параметра Android package name (Имя пакета Android) скопируйте свое значение applicationId в файл приложения build.gradle. В этом примере это
com.fabrikam.fcmtutorial1app.
Выберите Регистрация приложения.
Выберите Download google-services.json (Загрузить google-services.json), сохраните файл в папку приложения проекта, а затем выберите Далее.
Внесите следующие изменения конфигурации в проект в Android Studio.
В файл build.gradle уровня проекта (<project>/build.gradle) добавьте в раздел dependencies следующий текст.
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 для отправки push-запросов
На портале Azureщелкните Обзор всех>служб приложений, а затем щелкните серверную часть мобильных приложений. В разделе Параметрыщелкните App Service Push, а затем щелкните имя концентратора уведомлений.
Перейдите к Google (GCM), введите значение ключа сервера, полученное из Firebase в предыдущей процедуре, и нажмите кнопку Сохранить.
Серверная часть мобильных приложений теперь настроена для использования Firebase Cloud Messaging. Это позволяет отправлять push-уведомления в приложение, работающее на устройстве Android, с помощью концентратора уведомлений.
Обновление проекта сервера для отправки push-уведомлений
В этом разделе вы обновляете код в существующем серверном проекте мобильных приложений для отправки push-уведомлений при каждом добавлении нового элемента. Этот процесс обеспечивается функцией шаблона в Центрах уведомлений Azure, что позволяет осуществлять кроссплатформенные push-уведомления. Различные клиенты зарегистрированы для push-уведомлений с помощью шаблонов, и одно универсальное push-уведомление может быть доставлено на все клиентские платформы.
Выберите одну из следующих процедур, которые соответствуют типу внутреннего проекта— серверной части .NET или Node.js серверной части.
Проект бэкенд .NET
В Visual Studio щелкните правой кнопкой мыши проект сервера. Затем выберите Управление пакетами NuGet. Найдите
Microsoft.Azure.NotificationHubs, а затем выберите Установить. Этот процесс устанавливает библиотеку Центров уведомлений для отправки уведомлений из серверной части.В проекте сервера откройте контроллеры >TodoItemController.cs. Затем добавьте следующие директивы using:
using System.Collections.Generic; using Microsoft.Azure.NotificationHubs; using Microsoft.Azure.Mobile.Server.Config;В методе PostTodoItem добавьте следующий код после вызова InsertAsync:
// 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); // Send the message so that all template registrations that contain "messageParam" // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations. Dictionary<string,string> templateParams = new Dictionary<string,string>(); templateParams["messageParam"] = item.Text + " was added to the list."; try { // Send the push notification and log the results. var result = await hub.SendTemplateNotificationAsync(templateParams); // 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"); }Этот процесс отправляет шаблонное уведомление, содержащее item.Text, при вставке нового элемента.
Переопубликуйте серверный проект.
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 template payload. var payload = '{"messageParam": "' + 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 template notification. context.push.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;Этот процесс отправляет уведомление шаблона, содержащее элемент item.text при вставке нового элемента.
При изменении файла на локальном компьютере повторно опубликуйте проект сервера.
Настройка клиентского проекта для push-уведомлений
В представлении решения (или Обозревателе решений в Visual Studio) щелкните правой кнопкой мыши папку Компоненты, выберите Получить дополнительные компоненты..., найдите компонент клиента Google Cloud Messaging и добавьте его в проект.
Откройте файл проекта ToDoActivity.cs и добавьте следующую инструкцию using в класс:
using Gcm.Client;В классе ToDoActivity добавьте следующий новый код:
// Create a new instance field for this activity. static ToDoActivity instance = new ToDoActivity(); // Return the current activity instance. public static ToDoActivity CurrentActivity { get { return instance; } } // Return the Mobile Services client. public MobileServiceClient CurrentClient { get { return client; } }Это позволяет получить доступ к экземпляру мобильного клиента из процесса службы обработки push-уведомлений.
Добавьте следующий код в метод OnCreate после создания MobileServiceClient:
// Set the current instance of TodoActivity. instance = this; // Make sure the GCM client is set up correctly. GcmClient.CheckDevice(this); GcmClient.CheckManifest(this); // Register the app for push notifications. GcmClient.Register(this, ToDoBroadcastReceiver.senderIDs);
Теперь ToDoActivity готов к добавлению push-уведомлений.
Добавление кода push-уведомлений в приложение
Создайте новый класс в проекте с именем
ToDoBroadcastReceiver.Добавьте следующие инструкции using в класс ToDoBroadcastReceiver:
using Gcm.Client; using Microsoft.WindowsAzure.MobileServices; using Newtonsoft.Json.Linq;Добавьте следующие запросы разрешений между инструкциями и объявлением пространства имён .
[assembly: Permission(Name = "@[email protected]_MESSAGE")] [assembly: UsesPermission(Name = "@[email protected]_MESSAGE")] [assembly: UsesPermission(Name = "com.google.android.c2dm.permission.RECEIVE")] //GET_ACCOUNTS is only needed for android versions 4.0.3 and below [assembly: UsesPermission(Name = "android.permission.GET_ACCOUNTS")] [assembly: UsesPermission(Name = "android.permission.INTERNET")] [assembly: UsesPermission(Name = "android.permission.WAKE_LOCK")]Замените существующее определение класса ToDoBroadcastReceiver следующим образом:
[BroadcastReceiver(Permission = Gcm.Client.Constants.PERMISSION_GCM_INTENTS)] [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_MESSAGE }, Categories = new string[] { "@PACKAGE_NAME@" })] [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_REGISTRATION_CALLBACK }, Categories = new string[] { "@PACKAGE_NAME@" })] [IntentFilter(new string[] { Gcm.Client.Constants.INTENT_FROM_GCM_LIBRARY_RETRY }, Categories = new string[] { "@PACKAGE_NAME@" })] public class ToDoBroadcastReceiver : GcmBroadcastReceiverBase<PushHandlerService> { // Set the Google app ID. public static string[] senderIDs = new string[] { "<PROJECT_NUMBER>" }; }В приведенном выше коде необходимо заменить
<PROJECT_NUMBER>номером проекта, назначенным Google при подготовке приложения на портале разработчика Google.В файле проекта ToDoBroadcastReceiver.cs добавьте следующий код, определяющий класс PushHandlerService:
// The ServiceAttribute must be applied to the class. [Service] public class PushHandlerService : GcmServiceBase { public static string RegistrationID { get; private set; } public PushHandlerService() : base(ToDoBroadcastReceiver.senderIDs) { } }Обратите внимание, что этот класс является производным от GcmServiceBase и что атрибут Service должен применяться к этому классу.
Примечание.
Класс GcmServiceBase реализует методы OnRegistered(), OnUnRegistered(), OnMessage() и OnError(). Эти методы необходимо переопределить в классе PushHandlerService.
Добавьте следующий код в класс PushHandlerService, который переопределяет обработчик событий OnRegistered.
protected override void OnRegistered(Context context, string registrationId) { System.Diagnostics.Debug.WriteLine("The device has been registered with GCM.", "Success!"); // Get the MobileServiceClient from the current activity instance. MobileServiceClient client = ToDoActivity.CurrentActivity.CurrentClient; var push = client.GetPush(); // Define a message body for GCM. const string templateBodyGCM = "{\"data\":{\"message\":\"$(messageParam)\"}}"; // Define the template registration as JSON. JObject templates = new JObject(); templates["genericMessage"] = new JObject { {"body", templateBodyGCM } }; try { // Make sure we run the registration on the same thread as the activity, // to avoid threading errors. ToDoActivity.CurrentActivity.RunOnUiThread( // Register the template with Notification Hubs. async () => await push.RegisterAsync(registrationId, templates)); System.Diagnostics.Debug.WriteLine( string.Format("Push Installation Id", push.InstallationId.ToString())); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine( string.Format("Error with Azure push registration: {0}", ex.Message)); } }Этот метод использует возвращенный идентификатор регистрации GCM для регистрации в Azure для push-уведомлений. Теги можно добавить к регистрации только после её создания. Дополнительные сведения см. в статье Как: Добавить теги к установке устройства для активации push-to-tags.
Переопределите метод OnMessage в PushHandlerService следующим кодом:
protected override void OnMessage(Context context, Intent intent) { string message = string.Empty; // Extract the push notification message from the intent. if (intent.Extras.ContainsKey("message")) { message = intent.Extras.Get("message").ToString(); var title = "New item added:"; // Create a notification manager to send the notification. var notificationManager = GetSystemService(Context.NotificationService) as NotificationManager; // Create a new intent to show the notification in the UI. PendingIntent contentIntent = PendingIntent.GetActivity(context, 0, new Intent(this, typeof(ToDoActivity)), 0); // Create the notification using the builder. var builder = new Notification.Builder(context); builder.SetAutoCancel(true); builder.SetContentTitle(title); builder.SetContentText(message); builder.SetSmallIcon(Resource.Drawable.ic_launcher); builder.SetContentIntent(contentIntent); var notification = builder.Build(); // Display the notification in the Notifications Area. notificationManager.Notify(1, notification); } }Переопределите методы OnUnRegistered() и OnError() с помощью следующего кода.
protected override void OnUnRegistered(Context context, string registrationId) { throw new NotImplementedException(); } protected override void OnError(Context context, string errorId) { System.Diagnostics.Debug.WriteLine( string.Format("Error occurred in the notification: {0}.", errorId)); }
Тестирование push-уведомлений в приложении
Приложение можно протестировать с помощью виртуального устройства в эмуляторе. При выполнении эмулятора требуются дополнительные действия по настройке.
Виртуальное устройство должно иметь API Google в качестве целевого объекта в диспетчере виртуальных устройств Android (AVD).

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

Запустите приложение todolist, как и раньше, и вставьте новый элемент todo. На этот раз в области уведомлений отображается значок уведомления. Вы можете открыть ящик уведомлений, чтобы просмотреть полный текст уведомления.
