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


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

Обзор

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

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

Предпосылки

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

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

  1. На компьютере Mac запустите доступ к цепочке ключей. На левой панели навигации в разделе "Категория" откройте мои сертификаты. Найдите SSL-сертификат, скачанный в предыдущем разделе, и раскройте его содержимое. Выберите только сертификат (не выбирайте закрытый ключ). Затем экспортируйте его.
  2. На портале Azure выберите "Обзор всех>служб приложений". Затем выберите бэкэнд мобильных приложений.
  3. В разделе "Параметры" выберите "Отправить службу приложений". Затем выберите имя концентратора уведомлений.
  4. Перейдите к службам push-уведомлений Apple>загрузки сертификата. ** Загрузите .p12 файл, выбрав правильный режим (в зависимости от того, является ли SSL-сертификат клиента из предыдущего шага рабочим или находится в песочнице). Сохраните любые изменения.

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

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

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

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

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

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

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

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

  4. В разделе "Сборка" выберите подпись пакета iOS и выберите соответствующий профиль удостоверения и подготовки, который вы только что настроили для этого проекта.

    Это гарантирует, что проект использует новый профиль для подписывания кода. Официальную документацию по подготовке устройств Xamarin см. в разделе .

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

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

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

  3. На вкладке подписывания пакета iOS выберите соответствующее удостоверение и профиль подготовки, который вы только что настроили для этого проекта.

    Это гарантирует, что проект использует новый профиль для подписывания кода. Официальную документацию по подготовке устройств Xamarin см. в разделе .

  4. Дважды щелкните Info.plist, чтобы открыть его, а затем включите remoteNotifications в фоновом режиме.

Добавление 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. Затем переопределите событие didReceiveRemoteNotification:

     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 и сразу же закройте приложение, а затем убедитесь, что отображается уведомление.

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