Push-уведомления в iOS
Внимание
Сведения, приведенные в этом разделе, относятся к iOS 9 и более ранним, он был оставлен здесь для поддержки старых версий iOS. Сведения о iOS 10 и более поздних версиях см. в руководстве по платформе уведомлений пользователей для поддержки локального и удаленного уведомлений на устройстве iOS.
Push-уведомления должны быть краткими и содержать достаточно данных, чтобы уведомить мобильное приложение о том, что он должен связаться с серверным приложением для обновления. Например, когда поступает новое сообщение электронной почты, серверное приложение будет уведомлять только мобильное приложение о том, что новое сообщение поступило. Уведомление не будет содержать новое сообщение электронной почты. Мобильное приложение затем получите новые сообщения электронной почты с сервера, когда оно было соответствующим.
В центре 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-уведомления:
Нажмите кнопку "Отправить ", чтобы подтвердить регистрацию нового идентификатора приложения:
Затем необходимо создать сертификат для идентификатора приложения. В области навигации слева перейдите к разделу "Сертификаты > все " и нажмите
+
кнопку, как показано на следующем снимке экрана:Выберите, хотите ли вы использовать сертификат разработки или рабочей среды:
Затем выберите новый идентификатор приложения, который мы только что создали:
Вы увидите инструкции, которые помогут вам создать запрос на подпись сертификата с помощью приложения "Доступ к цепочке ключей" на компьютере Mac.
Теперь, когда сертификат был создан, он должен использоваться как часть процесса сборки для подписывания приложения, чтобы он мог зарегистрировать в APN. Для этого требуется создание и установка профиля подготовки, использующего сертификат.
Чтобы создать профиль подготовки разработки, перейдите в раздел "Профили подготовки" и выполните действия по его созданию с помощью только что созданного идентификатора приложения.
Создав профиль подготовки, откройте организатор Xcode и обновите его. Если созданный профиль подготовки не отображается, может потребоваться скачать профиль на портале подготовки iOS и вручную импортировать его. На следующем снимке экрана показан пример организатора с добавленным профилем подготовки:
На этом этапе необходимо настроить проект Xamarin.iOS для использования нового созданного профиля подготовки. Это сделано в диалоговом окне "Параметры проекта" на вкладке "Подписывание пакета iOS", как показано на следующем снимке экрана:
На этом этапе приложение настроено для работы с push-уведомлениями. Однако для сертификата еще несколько шагов необходимо выполнить несколько действий. Этот сертификат имеет формат DER, несовместимый с PushSharp, который требует сертификата обмена персональными данными (PKCS12). Чтобы преобразовать сертификат таким образом, чтобы он был доступен pushSharp, выполните следующие заключительные действия:
- Скачайте файл сертификата — вход на портал подготовки iOS, перейдите на вкладку "Сертификаты", выберите сертификат, связанный с правильным профилем подготовки, и выберите "Скачать ".
- Открыть доступ к цепочке ключей. Это приложение — это интерфейс графического интерфейса для системы управления паролями в 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— маркер устройства больше не активен для раздела.
Кроме того, новый timestamp
ключ данных JSON будет находиться в тексте ответа:
Если значение в заголовке :status равно 410, значение этого ключа — это последний раз, когда APN подтвердил, что маркер устройства больше не действителен для раздела.
Остановите push-уведомления до тех пор, пока устройство не зарегистрирует маркер с последующей меткой времени в поставщике.
Итоги
В этом разделе представлены основные понятия, связанные с push-уведомлениями в iOS. Он объяснил роль службы шлюза push-уведомлений Apple (APNS). Затем он рассмотрел создание и использование сертификатов безопасности, необходимых для APNS. Наконец, этот документ закончился с обсуждением того, как серверы приложений могут использовать службы обратной связи для остановки отслеживания маркеров устройств с истекшим сроком действия.