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


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

Важный

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

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

В центре 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 на веб-сайте Apple

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

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

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

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

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

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

    выберите push-уведомления

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

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

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

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

  8. Выберите, хотите ли вы использовать сертификат разработки или сертификат для промышленной эксплуатации.

    Выбор сертификата разработки или производства

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

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

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

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

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

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

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

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

  1. Скачайте файл сертификата — вход на портал подготовки iOS, перейдите на вкладку "Сертификаты", выберите сертификат, связанный с правильным профилем подготовки, и выберите Скачать.
  2. Open Keychain Access . Это графический интерфейс для системы управления паролями в 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 — токен устройства больше не активен для темы.

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

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

Остановите отправку уведомлений до тех пор, пока устройство не зарегистрирует токен с более поздним временным штампом у вашего поставщика.

Сводка

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