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

Обзор

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

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

Обязательные условия

Зарегистрируйте приложение для push-уведомлений на портале разработчика Apple.

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

  1. На компьютере Mac запустите программу Keychain Access. На панели навигации слева в разделе Category (Категория) откройте My Certificates (Мои сертификаты). Найдите и откройте скачанный на предыдущем этапе SSL-сертификат. Выберите только сертификат (без закрытого ключа). Затем экспортируйте его.
  2. На портале Azure последовательно выберите Browse All (Просмотреть все)>Службы приложений. Выберите серверную часть для функции "Мобильные приложения".
  3. В разделе Параметры выберите Push-уведомления службы приложений. Затем выберите имя концентратора уведомлений.
  4. перейдите в Notification Services>Upload сертификатPush-уведомлений Apple. Передайте P12-файл, выбрав правильный режим (в зависимости от того, откуда получен SSL-сертификат клиента: из рабочей среды или песочницы). Сохраните внесенные изменения.

Теперь ваша служба настроена для работы с push-уведомлениями в iOS.

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

В этом разделе описывается обновление кода в существующем проекте серверной части мобильных приложений, которое позволит отправлять push-уведомления при каждом добавлении нового элемента. Этот процесс реализуется с помощью шаблонов Центров уведомлений, включая отправку push-уведомлений между разными платформами. Разные клиенты регистрируются для обмена push-уведомлениями с помощью шаблонов; одно такое универсальное push-уведомление можно получать на всех клиентских платформах.

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

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

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

  2. В серверном проекте откройте Controllers>TodoItemController. CS. Затем добавьте следующие операторы using:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. В метод 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.

  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 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.

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

Настройка проекта Xamarin.iOS

Настройка проекта iOS в Xamarin Studio

  1. В Xamarin. Studio откройте info. plistи обновите идентификатор пакета с помощью идентификатора пакета, созданного ранее, с новым идентификатором приложения.

  2. Прокрутите вниз до раздела Background Modes (Фоновые режимы). Установите флажки Enable Background Modes (Разрешить фоновые режимы) и Remote notifications (Удаленные уведомления).

  3. Дважды щелкните проект на панели решения, чтобы открыть параметры проекта.

  4. В разделе Build (Сборка) выберите iOS Bundle Signing (Подпись пакета iOS), а затем выберите нужное удостоверение и созданный для этого проекта профиль подготовки в соответствующих полях.

    Таким образом, проект будет использовать новый профиль для подписи кода. Официальную документацию по подготовке устройств Xamarin см. в статье Device Provisioning (Подготовка устройства).

Настройка проекта iOS в Visual Studio

  1. В Visual Studio щелкните правой кнопкой мыши проект и выберите пункт Свойства.

  2. На страницах свойств щелкните вкладку Приложение iOS и обновите идентификатор в поле Идентификатор, указав свой ранее созданный ИД.

  3. На вкладке iOS Bundle Signing (Подпись пакета iOS) выберите нужное удостоверение и созданный для этого проекта профиль подготовки в соответствующих полях.

    Таким образом, проект будет использовать новый профиль для подписи кода. Официальную документацию по подготовке устройств Xamarin см. в статье Device Provisioning (Подготовка устройства).

  4. Дважды щелкните Info.plist, чтобы открыть этот элемент, а затем включите RemoteNotifications в разделе Background Modes (Фоновые режимы).

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

  1. В QSTodoService добавьте приведенное ниже свойство, чтобы AppDelegate мог получить мобильный клиент.

    public MobileServiceClient GetClient {
        get
        {
            return client;
        }
        private set
        {
            client = value;
        }
    }
    
  2. Добавьте следующий оператор using в верхнюю часть файла AppDelegate.cs .

    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  3. В 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;
     }
    
  4. В этом же файле переопределите событие 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);
    }
    
  5. Затем переопределите событие 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-уведомлений в приложении

  1. Нажмите кнопку Выполнить, чтобы выполнить сборку проекта и запустить приложение на устройстве iOS, а затем нажмите кнопку ОК, чтобы разрешить прием push-уведомлений.

    Примечание

    Необходимо явно разрешить прием push-уведомлений от вашего приложения. Этот запрос отображается только при первом запуске приложения.

  2. В приложении введите задачу, а затем щелкните значок плюс ( + ).

  3. Убедитесь, что уведомление получено, а затем нажмите кнопку ОК , чтобы закрыть уведомление.

  4. Повторите шаг 2 и сразу закройте приложение, затем убедитесь, что уведомление отображается.

Вы успешно завершили ознакомление с данным учебником.