Добавление push-уведомлений в приложение Xamarin.iOS
Обзор
В этом руководстве мы добавим push-уведомления в проект быстрого запуска Xamarin.iOS, чтобы при каждом добавлении новой записи на устройство отправлялось push-уведомление.
Если вы не используете скачанный проект сервера, необходимо добавить пакет расширений для push-уведомлений. Дополнительные сведения о пакетах расширений для сервера см. в статье Работа с пакетом SDK для внутреннего сервера .NET для мобильных приложений Azure.
Обязательные условия
- Ознакомьтесь с кратким руководством по Xamarin.iOS .
- Физическое устройство iOS. Push-уведомления не поддерживаются в симуляторе iOS.
Зарегистрируйте приложение для push-уведомлений на портале разработчика Apple.
- Зарегистрируйте идентификатор приложения для приложения. Создайте явный идентификатор приложения (не идентификатор приложения с подстановочным знаком), а для идентификатора пакетаиспользуйте точный идентификатор пакета, который находится в проекте быстрого запуска Xcode. Также необходимо выбрать параметр Push-уведомления.
- Затем, чтобы подготовиться к настройке push-уведомлений, создайте SSL-сертификат "Разработка" или "Распространение".
Настройка мобильного приложения для отправки push-уведомлений
- На компьютере Mac запустите программу Keychain Access. На панели навигации слева в разделе Category (Категория) откройте My Certificates (Мои сертификаты). Найдите и откройте скачанный на предыдущем этапе SSL-сертификат. Выберите только сертификат (без закрытого ключа). Затем экспортируйте его.
- На портале Azure последовательно выберите Browse All (Просмотреть все)>Службы приложений. Выберите серверную часть для функции "Мобильные приложения".
- В разделе Параметры выберите Push-уведомления службы приложений. Затем выберите имя концентратора уведомлений.
- перейдите в Notification Services>Upload сертификатPush-уведомлений Apple. Передайте P12-файл, выбрав правильный режим (в зависимости от того, откуда получен SSL-сертификат клиента: из рабочей среды или песочницы). Сохраните внесенные изменения.
Теперь ваша служба настроена для работы с push-уведомлениями в iOS.
Обновление серверного проекта для отправки push-уведомлений
В этом разделе описывается обновление кода в существующем проекте серверной части мобильных приложений, которое позволит отправлять push-уведомления при каждом добавлении нового элемента. Этот процесс реализуется с помощью шаблонов Центров уведомлений, включая отправку push-уведомлений между разными платформами. Разные клиенты регистрируются для обмена push-уведомлениями с помощью шаблонов; одно такое универсальное push-уведомление можно получать на всех клиентских платформах.
Выберите одну из следующих процедур, соответствующих типу проекта серверной части — серверной части .NET или серверной части Node.js.
Серверный проект .NET
В Visual Studio щелкните правой кнопкой мыши серверный проект. Затем выберите Управление пакетами NuGet. Найдите
Microsoft.Azure.NotificationHubs
, а затем нажмите кнопку Установить. Этот процесс устанавливает библиотеку Центров уведомлений для отправки уведомлений из серверной части.В серверном проекте откройте Controllers>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.
При редактировании этого файла на локальном компьютере повторно опубликуйте серверный проект.
Настройка проекта Xamarin.iOS
Настройка проекта iOS в Xamarin Studio
В Xamarin. Studio откройте info. plistи обновите идентификатор пакета с помощью идентификатора пакета, созданного ранее, с новым идентификатором приложения.
Прокрутите вниз до раздела Background Modes (Фоновые режимы). Установите флажки Enable Background Modes (Разрешить фоновые режимы) и Remote notifications (Удаленные уведомления).
Дважды щелкните проект на панели решения, чтобы открыть параметры проекта.
В разделе Build (Сборка) выберите iOS Bundle Signing (Подпись пакета iOS), а затем выберите нужное удостоверение и созданный для этого проекта профиль подготовки в соответствующих полях.
Таким образом, проект будет использовать новый профиль для подписи кода. Официальную документацию по подготовке устройств Xamarin см. в статье Device Provisioning (Подготовка устройства).
Настройка проекта iOS в Visual Studio
В Visual Studio щелкните правой кнопкой мыши проект и выберите пункт Свойства.
На страницах свойств щелкните вкладку Приложение iOS и обновите идентификатор в поле Идентификатор, указав свой ранее созданный ИД.
На вкладке iOS Bundle Signing (Подпись пакета iOS) выберите нужное удостоверение и созданный для этого проекта профиль подготовки в соответствующих полях.
Таким образом, проект будет использовать новый профиль для подписи кода. Официальную документацию по подготовке устройств Xamarin см. в статье Device Provisioning (Подготовка устройства).
Дважды щелкните Info.plist, чтобы открыть этот элемент, а затем включите RemoteNotifications в разделе Background Modes (Фоновые режимы).
Добавление push-уведомлений в приложение
В QSTodoService добавьте приведенное ниже свойство, чтобы AppDelegate мог получить мобильный клиент.
public MobileServiceClient GetClient { get { return client; } private set { client = value; } }
Добавьте следующий оператор
using
в верхнюю часть файла AppDelegate.cs .using Microsoft.WindowsAzure.MobileServices; using Newtonsoft.Json.Linq;
В AppDelegate переопределите событие FinishedLaunching.
public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions) { // registers for push for iOS8 var settings = UIUserNotificationSettings.GetSettingsForTypes( UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new NSSet()); UIApplication.SharedApplication.RegisterUserNotificationSettings(settings); UIApplication.SharedApplication.RegisterForRemoteNotifications(); return true; }
В этом же файле переопределите событие
RegisteredForRemoteNotifications
. В этом коде регистрируется простое шаблонное уведомление, которое будет рассылаться сервером по всем поддерживаемым платформам.Дополнительные сведения о шаблонах центров уведомлений см. в статье Шаблоны.
public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) { MobileServiceClient client = QSTodoService.DefaultService.GetClient; const string templateBodyAPNS = "{\"aps\":{\"alert\":\"$(messageParam)\"}}"; JObject templates = new JObject(); templates["genericMessage"] = new JObject { {"body", templateBodyAPNS} }; // Register for push with your mobile app var push = client.GetPush(); push.RegisterAsync(deviceToken, templates); }
Затем переопределите событие DidReceivedRemoteNotification :
public override void DidReceiveRemoteNotification (UIApplication application, NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler) { NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary; string alert = string.Empty; if (aps.ContainsKey(new NSString("alert"))) alert = (aps [new NSString("alert")] as NSString).ToString(); //show alert if (!string.IsNullOrEmpty(alert)) { UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null); avAlert.Show(); } }
Ваше приложение теперь обновлено для поддержки push-уведомлений.
Тестирование push-уведомлений в приложении
Нажмите кнопку Выполнить, чтобы выполнить сборку проекта и запустить приложение на устройстве iOS, а затем нажмите кнопку ОК, чтобы разрешить прием push-уведомлений.
Примечание
Необходимо явно разрешить прием push-уведомлений от вашего приложения. Этот запрос отображается только при первом запуске приложения.
В приложении введите задачу, а затем щелкните значок плюс ( + ).
Убедитесь, что уведомление получено, а затем нажмите кнопку ОК , чтобы закрыть уведомление.
Повторите шаг 2 и сразу закройте приложение, затем убедитесь, что уведомление отображается.
Вы успешно завершили ознакомление с данным учебником.