Push-уведомления в iOS
Важный
Сведения, приведенные в этом разделе, относятся к iOS 9 и более ранним, он был оставлен здесь для поддержки старых версий iOS. Для получения информации о поддержке локальных и удалённых уведомлений в iOS 10 и более поздних версиях, обратитесь к руководству по фреймворку уведомлений пользователя .
Push-уведомления должны быть краткими и содержать достаточно данных, чтобы уведомить мобильное приложение о том, что он должен связаться с серверным приложением для обновления. Например, когда поступает новое сообщение электронной почты, серверное приложение будет уведомлять только мобильное приложение о том, что новое сообщение поступило. Уведомление не будет содержать самого нового email. Мобильное приложение затем будет получать новые сообщения электронной почты с сервера, когда это будет уместно.
В центре push-уведомлений в iOS находится служба шлюза push-уведомлений Apple (APNS). Это служба, предоставляемая Apple, которая отвечает за маршрутизацию уведомлений с сервера приложений на устройства 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.
Чтобы создать сертификаты, перейдите на портал подготовки iOS на веб-сайте Apple, как показано на следующем снимке экрана (обратите внимание на пункт меню "Идентификаторы приложений" слева):
Затем перейдите к разделу идентификатора приложения и создайте новый идентификатор приложения, как показано на следующем снимке экрана:
Щелкнув кнопку +, вы сможете ввести описание и идентификатор пакета для идентификатора приложения, как показано на следующем снимке экрана:
Убедитесь, что выбран явный идентификатор приложения, и убедитесь, что идентификатор пакета не заканчивается
*
. При этом будет создан идентификатор, который подходит для нескольких приложений, а сертификаты push-уведомлений должны быть для одного приложения.В разделе "Службы приложений" выберите Push-уведомления:
Нажмите Отправить, чтобы подтвердить регистрацию нового идентификатора приложения:
Затем необходимо создать сертификат для идентификатора приложения. В левой области навигации перейдите к Сертификаты > Все и нажмите кнопку
+
, как показано на следующем снимке экрана.Выберите, хотите ли вы использовать сертификат разработки или сертификат для промышленной эксплуатации.
Затем выберите новый идентификатор приложения, который мы только что создали:
Вы увидите инструкции, которые помогут вам создать запрос на подпись сертификата с помощью приложения Keychain Access на компьютере Mac.
Теперь, когда сертификат был создан, он должен использоваться в рамках процесса сборки для подписи приложения, чтобы оно могло зарегистрироваться в APNs. Для этого требуется создание и установка профиля подготовки, использующего сертификат.
Чтобы создать профиль подготовки разработки, перейдите к разделу профилей подготовки и выполните действия по его созданию, используя только что созданный идентификатор приложения.
После создания профиля конфигурирования откройте Xcode Organizer и обновите. Если созданный профиль подготовки не отображается, может потребоваться скачать профиль на портале подготовки iOS и вручную импортировать его. На следующем снимке экрана показан пример Organizer с добавленным профилем предоставления:
На этом этапе необходимо настроить проект Xamarin.iOS для использования новосозданного профиля конфигурации. Это делается в диалоговом окне параметров проекта на вкладке подписы вание пакета iOS, как показано на следующем снимке экрана:
На этом этапе приложение настроено для работы с push-уведомлениями. Однако для работы с сертификатом необходимо выполнить еще несколько шагов. Этот сертификат имеет формат DER, несовместимый с PushSharp, который требует сертификата обмена персональными данными (PKCS12). Чтобы преобразовать сертификат таким образом, чтобы он был доступен pushSharp, выполните следующие заключительные действия:
- Скачайте файл сертификата — вход на портал подготовки iOS, перейдите на вкладку "Сертификаты", выберите сертификат, связанный с правильным профилем подготовки, и выберите Скачать.
- Open Keychain Access . Это графический интерфейс для системы управления паролями в OS X.
- Импортируйте сертификат: если сертификат еще не установлен, выберите Файл...Импортировать элементы в меню "Доступ к цепочке ключей". Перейдите к сертификату, экспортируемму выше, и выберите его.
- Экспорт сертификата. Разверните сертификат, чтобы связанный закрытый ключ был виден, щелкните правой кнопкой мыши ключ и выберите "Экспорт". Вам будет предложено указать имя файла и пароль для экспортированного файла.
Теперь мы закончили с сертификатами. Мы создали сертификат, который будет использоваться для подписывания приложений 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. Наконец, этот документ закончился обсуждением того, как серверы приложений могут использовать службы отзывов для остановки отслеживания маркеров устройств с истекшим сроком действия.