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


Push-уведомления в iOS

Внимание

Сведения, приведенные в этом разделе, относятся к iOS 9 и более ранним, он был оставлен здесь для поддержки старых версий iOS. Сведения о iOS 10 и более поздних версиях см. в руководстве по платформе уведомлений пользователей для поддержки локального и удаленного уведомлений на устройстве iOS.

Push-уведомления должны быть краткими и содержать достаточно данных, чтобы уведомить мобильное приложение о том, что он должен связаться с серверным приложением для обновления. Например, когда поступает новое сообщение электронной почты, серверное приложение будет уведомлять только мобильное приложение о том, что новое сообщение поступило. Уведомление не будет содержать новое сообщение электронной почты. Мобильное приложение затем получите новые сообщения электронной почты с сервера, когда оно было соответствующим.

В центре push-уведомлений в iOS находится служба шлюза push-уведомлений Apple (APNS). Это служба, предоставляемая Apple, которая отвечает за маршрутизацию уведомлений с сервера приложений на устройства iOS. На следующем рисунке показана топология push-уведомлений для iOS: На этом изображении показана топология push-уведомлений для iOS

Удаленные уведомления сами являются форматированными строками JSON, которые соответствуют формату и протоколам, указанным в разделе "Полезные данные уведомлений" руководства по программированию локальных и push-уведомлений в документации разработчика iOS.

Apple поддерживает две среды APNS: песочницу и рабочую среду. Среда песочницы предназначена для тестирования на этапе разработки и находится на gateway.sandbox.push.apple.com TCP-порту 2195. Рабочая среда предназначена для использования в приложениях, которые были развернуты и находятся в gateway.push.apple.com TCP-порту 2195.

Требования

Push-уведомление должно соблюдать следующие правила, которые определяются архитектурой APNS:

  • Ограничение байтов 256 байтов . Весь размер сообщения уведомления не должен превышать 256 байт.
  • Нет подтверждения квитанции. APNS не предоставляет отправителю никаких уведомлений о том, что сообщение сделало его предполагаемому получателю. Если устройство недоступно и отправляется несколько последовательных уведомлений, все уведомления, кроме последних, будут потеряны. На устройство будет доставлено только последнее уведомление.
  • Для каждого приложения требуется безопасный сертификат . Взаимодействие с APNS должно выполняться по протоколу SSL.

Создание и использование сертификатов

Для каждой среды, упоминание упоминание в предыдущем разделе, требуется собственный сертификат. В этом разделе описано, как создать сертификат, связать его с профилем подготовки, а затем получить сертификат Обмена персональными данными для использования с PushSharp.

  1. Чтобы создать сертификаты, перейдите на портал подготовки iOS на веб-сайте Apple, как показано на следующем снимке экрана (обратите внимание на пункт меню "Идентификаторы приложений" слева):

    Портал подготовки iOS на веб-сайте Apples

  2. Затем перейдите к разделу идентификатора приложения и создайте новый идентификатор приложения, как показано на следующем снимке экрана:

    Перейдите к разделу идентификаторов приложений и создайте новый идентификатор приложения

  3. + Щелкнув кнопку, вы сможете ввести описание и идентификатор пакета для идентификатора приложения, как показано на следующем снимке экрана:

    Введите описание и идентификатор пакета для идентификатора приложения

  4. Не забудьте выбрать явный идентификатор приложения, а идентификатор пакета не заканчивается * . При этом будет создан идентификатор, который подходит для нескольких приложений, а сертификаты push-уведомлений должны быть для одного приложения.

  5. В разделе Служба приложений выберите push-уведомления:

    Выбор push-уведомлений

  6. Нажмите кнопку "Отправить ", чтобы подтвердить регистрацию нового идентификатора приложения:

    Подтверждение регистрации нового идентификатора приложения

  7. Затем необходимо создать сертификат для идентификатора приложения. В области навигации слева перейдите к разделу "Сертификаты > все " и нажмите + кнопку, как показано на следующем снимке экрана:

    Создание сертификата для идентификатора приложения

  8. Выберите, хотите ли вы использовать сертификат разработки или рабочей среды:

    Выбор сертификата разработки или рабочей среды

  9. Затем выберите новый идентификатор приложения, который мы только что создали:

    Выберите только что созданный идентификатор приложения

  10. Вы увидите инструкции, которые помогут вам создать запрос на подпись сертификата с помощью приложения "Доступ к цепочке ключей" на компьютере Mac.

  11. Теперь, когда сертификат был создан, он должен использоваться как часть процесса сборки для подписывания приложения, чтобы он мог зарегистрировать в APN. Для этого требуется создание и установка профиля подготовки, использующего сертификат.

  12. Чтобы создать профиль подготовки разработки, перейдите в раздел "Профили подготовки" и выполните действия по его созданию с помощью только что созданного идентификатора приложения.

  13. Создав профиль подготовки, откройте организатор Xcode и обновите его. Если созданный профиль подготовки не отображается, может потребоваться скачать профиль на портале подготовки iOS и вручную импортировать его. На следующем снимке экрана показан пример организатора с добавленным профилем подготовки:
    На снимке экрана показан пример организатора с добавленным профилем подготовки

  14. На этом этапе необходимо настроить проект Xamarin.iOS для использования нового созданного профиля подготовки. Это сделано в диалоговом окне "Параметры проекта" на вкладке "Подписывание пакета iOS", как показано на следующем снимке экрана:
    Настройка проекта Xamarin.iOS для использования этого созданного профиля подготовки

На этом этапе приложение настроено для работы с push-уведомлениями. Однако для сертификата еще несколько шагов необходимо выполнить несколько действий. Этот сертификат имеет формат DER, несовместимый с PushSharp, который требует сертификата обмена персональными данными (PKCS12). Чтобы преобразовать сертификат таким образом, чтобы он был доступен pushSharp, выполните следующие заключительные действия:

  1. Скачайте файл сертификата — вход на портал подготовки iOS, перейдите на вкладку "Сертификаты", выберите сертификат, связанный с правильным профилем подготовки, и выберите "Скачать ".
  2. Открыть доступ к цепочке ключей. Это приложение — это интерфейс графического интерфейса для системы управления паролями в OS X.
  3. Импортируйте сертификат . Если сертификат еще не установлен, файл... Импорт элементов из меню "Доступ к цепочке ключей". Перейдите к сертификату, экспортируемму выше, и выберите его.
  4. Экспорт сертификата — разверните сертификат , чтобы связанный закрытый ключ был видимым, щелкните правой кнопкой мыши ключ и выберите "Экспорт". Вам будет предложено указать имя файла и пароль для экспортированного файла.

На этом этапе мы делаем с сертификатами. Мы создали сертификат, который будет использоваться для подписывания приложений iOS и преобразовал этот сертификат в формат, который можно использовать с PushSharp в серверном приложении. Далее рассмотрим, как приложения iOS взаимодействуют с APNS.

Регистрация в APNS

Прежде чем приложение iOS сможет получать удаленное уведомление, оно должно зарегистрировать в APNS. APNS создаст уникальный маркер устройства и вернется к приложению iOS. Затем приложение iOS примет маркер устройства, а затем зарегистрирует себя на сервере приложений. Когда все это произойдет, регистрация завершится, а сервер приложений может отправлять push-уведомления на мобильное устройство.

В теории маркер устройства может изменяться каждый раз, когда приложение iOS регистрируется в APNS, однако на практике это часто не происходит. В качестве оптимизации приложение может кэшировать последний маркер устройства и обновлять сервер приложений только при изменении. На следующей схеме показан процесс регистрации и получения маркера устройства:

На этой схеме показан процесс регистрации и получения маркера устройства

Регистрация с помощью APNS обрабатывается в FinishedLaunching методе класса делегата приложения путем вызова RegisterForRemoteNotificationTypes текущего UIApplication объекта. При регистрации приложения iOS в APNS необходимо также указать, какие типы удаленных уведомлений требуется получать. Эти типы удаленных уведомлений объявляются в перечислении UIRemoteNotificationType. В следующем фрагменте кода приведен пример регистрации приложения iOS для получения уведомлений об удаленном оповещении и индикаторах событий:

if (UIDevice.CurrentDevice.CheckSystemVersion (8, 0)) {
    var pushSettings = UIUserNotificationSettings.GetSettingsForTypes (
                       UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound,
                       new NSSet ());

    UIApplication.SharedApplication.RegisterUserNotificationSettings (pushSettings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications ();
} else {
    UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
    UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);
}

Запрос на регистрацию APNS происходит в фоновом режиме — при получении ответа iOS вызовет метод RegisteredForRemoteNotifications в AppDelegate классе и передает зарегистрированный маркер устройства. Маркер будет содержаться в объекте NSData . В следующем фрагменте кода показано, как получить маркер устройства, предоставленный APNS:

public override void RegisteredForRemoteNotifications (
UIApplication application, NSData deviceToken)
{
    // Get current device token
    var DeviceToken = deviceToken.Description;
    if (!string.IsNullOrWhiteSpace(DeviceToken)) {
        DeviceToken = DeviceToken.Trim('<').Trim('>');
    }

    // Get previous device token
    var oldDeviceToken = NSUserDefaults.StandardUserDefaults.StringForKey("PushDeviceToken");

    // Has the token changed?
    if (string.IsNullOrEmpty(oldDeviceToken) || !oldDeviceToken.Equals(DeviceToken))
    {
        //TODO: Put your own logic here to notify your server that the device token has changed/been created!
    }

    // Save new device token
    NSUserDefaults.StandardUserDefaults.SetString(DeviceToken, "PushDeviceToken");
}

Если регистрация завершается ошибкой по какой-либо причине (например, устройство не подключено к Интернету), iOS вызовет FailedToRegisterForRemoteNotifications класс делегата приложения. В следующем фрагменте кода показано, как отобразить оповещение пользователю, информирующее о том, что регистрация завершилась ошибкой:

public override void FailedToRegisterForRemoteNotifications (UIApplication application , NSError error)
{
    new UIAlertView("Error registering push notifications", error.LocalizedDescription, null, "OK", null).Show();
}

Хранение маркеров устройств

Срок действия маркеров устройства истекает или изменяется с течением времени. Из-за этого серверные приложения должны будут выполнять некоторые очистки дома и очистки этих просроченных или измененных маркеров. Когда приложение отправляет push-уведомление на устройство с истекшим сроком действия маркера, APNS записывает и сохраняет этот маркер с истекшим сроком действия. Затем серверы могут запрашивать APNS, чтобы узнать, какие маркеры истекли.

APNS используется для предоставления службы отзывов — конечной точки HTTPS, которая проходит проверку подлинности с помощью сертификата, созданного для отправки push-уведомлений, и отправляет обратно данные о том, какие маркеры истекли. Это не рекомендуется Apple и удалено.

Вместо этого существует новый код состояния HTTP для случая, который ранее сообщался службой отзывов:

410— маркер устройства больше не активен для раздела.

Кроме того, новый timestamp ключ данных JSON будет находиться в тексте ответа:

Если значение в заголовке :status равно 410, значение этого ключа — это последний раз, когда APN подтвердил, что маркер устройства больше не действителен для раздела.

Остановите push-уведомления до тех пор, пока устройство не зарегистрирует маркер с последующей меткой времени в поставщике.

Итоги

В этом разделе представлены основные понятия, связанные с push-уведомлениями в iOS. Он объяснил роль службы шлюза push-уведомлений Apple (APNS). Затем он рассмотрел создание и использование сертификатов безопасности, необходимых для APNS. Наконец, этот документ закончился с обсуждением того, как серверы приложений могут использовать службы обратной связи для остановки отслеживания маркеров устройств с истекшим сроком действия.