Служба уведомления нажатия Apple

Служба Apple Push Notification (APNs, если коротко) является главной центральной частью удаленной функции уведомлений. Это - устойчивая и очень эффективная служба для распространения информации к устройствам OS X и iOS. Каждое устройство устанавливает аккредитованное и зашифрованное IP-соединение со службой и получает уведомления по этому постоянному соединению. Если уведомление для приложения поступает, когда то приложение не работает, устройство предупреждает пользователя, что приложение имеет данные, ожидающие его.

Разработчики программного обеспечения («провайдеры») порождают уведомления в своем программном обеспечении сервера. Провайдер соединяется с APNs через персистентный и безопасный канал при контроле входящих данных, предназначенных для их клиентских приложений. Когда новые данные для приложения поступают, провайдер подготавливает и отправляет уведомление через канал к APNs, продвигающему уведомление целевому устройству.

В дополнение к тому, чтобы быть транспортной службой простой, но эффективной и большой емкости APNs включает компонент качества обслуживания по умолчанию, обеспечивающий возможности промежуточной буферизации. Посмотрите Качество обслуживания для получения дополнительной информации.

Связь провайдера со Службой Уведомления Нажатия Apple и Планированием, Регистрацией и Обработкой Уведомлений обсуждает определенные требования реализации для провайдеров и приложений для iOS, соответственно.

Удаленное уведомление и его путь

Служба Apple Push Notification транспортирует и направляет удаленное уведомление с данного провайдера на данное устройство. Уведомление является коротким сообщением, состоящим из двух главных частей данных: маркер устройства и полезная нагрузка. Маркер устройства походит на телефонный номер; это содержит информацию, позволяющую APNs определить местоположение устройства, на котором установлено клиентское приложение. APNs также использует его для аутентификации маршрутизации уведомления. Полезная нагрузка является JSON-определенным списком свойств, указывающим, как должен быть предупрежден пользователь приложения на устройстве.

Потоки данных удаленного уведомления в одном направлении. Провайдер составляет пакет уведомления, включающий маркер устройства для клиентского приложения и полезной нагрузки. Провайдер отправляет уведомление APNs, поочередно продвигающему уведомление устройству.

Когда провайдер аутентифицирует себя к APNs, он отправляет свою тему в сервер APNs, идентифицирующий приложение, для которого он предоставляет данные. Темой в настоящее время является идентификатор пакета целевого приложения.

Рисунок 3-1  Продвигая удаленное уведомление от провайдера до клиентского приложения
A remote notification from a provider to a client application

Рисунок 3-1 является значительно упрощенным описанием виртуальной сети, которую APNs делает возможным среди провайдеров и устройств. Бывшие обращенным к устройству и бывшие обращенным к провайдеру стороны APNs оба имеют многократные точки соединения; на бывшей обращенным к провайдеру стороне их вызывают шлюзами. Существуют обычно многократные провайдеры, каждый делающий одно или более постоянных и безопасных соединений с APNs через эти шлюзы. И эти провайдеры отправляют уведомления через APNs ко многим устройствам, на которых установлены их клиентские приложения. Рисунок 3-2 является немного более реалистическим описанием.

Рисунок 3-2  Продвигая удаленные уведомления с многократных провайдеров на многократные устройства
Remote notifications from multiple providers to multiple devicesRemote notifications from multiple providers to multiple devices

Служба обратной связи дает информацию о провайдерах об уведомлениях, которые не могли быть поставлены — например, потому что целевое приложение больше не устанавливается на том устройстве. Для получения дополнительной информации посмотрите Службу Обратной связи.

Качество обслуживания

Служба Apple Push Notification включает компонент Quality of Service (QoS) по умолчанию, выполняющий функцию промежуточной буферизации.

Если APNs пытается поставить уведомление, но устройство является оффлайновым, уведомление сохранено в течение ограниченного промежутка времени и поставлено устройству, когда это становится доступным.

Только одно недавнее уведомление для определенного приложения сохранено. Если многократные уведомления отправляются, в то время как устройство оффлайновое, каждое новое уведомление заставляет предшествующее уведомление быть отброшенным. Это поведение хранения только новейшего уведомления упоминается как объединение уведомлений.

Если устройство остается оффлайновым в течение длительного времени, отбрасываются любые уведомления, которые были сохранены для него.

Архитектура безопасности

Для включения коммуникации между провайдером и устройством служба Apple Push Notification должна представить определенные точки входа им. Но затем гарантировать безопасность, это должно также отрегулировать доступ к этим точкам входа. С этой целью APNs требует двух разных уровней доверия для провайдеров, устройств и их связи. Они известны как доверие соединения и маркерное доверие.

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

После того, как APNs установил доверительные отношения в точках входа, это должно тогда гарантировать, что передает уведомления законным конечным точкам только. Чтобы сделать это, это должно проверить маршрутизацию сообщений, перемещающихся через транспорт; только устройство, которое является намеченной целью уведомления, должно получить ее.

В APNs обеспечение точной маршрутизации сообщений — или маркерное доверие — сделано возможным через маркер устройства. Маркер устройства является непрозрачным идентификатором устройства, которое APNs дает устройству, когда это сначала соединяется с ним. Устройство совместно использует маркер устройства со своим провайдером. После того этот маркер сопровождает каждое уведомление от провайдера. Это - основание для установления доверительных отношений, что маршрутизация определенного уведомления законна.

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

Доверие службы к подключению устройства

APNs устанавливает идентификационные данные соединительного устройства через TLS одноранговая аутентификация. (Обратите внимание на то, что система заботится об этом этапе доверия соединения; Вы ничего не должны реализовывать сами.) В ходе этой процедуры устройство инициирует соединение TLS с APNs, возвращающим его сертификат сервера. Устройство проверяет этот сертификат и затем отправляет его сертификат устройства в APNs, проверяющий тот сертификат.

Service-to-device connection trust

Доверие провайдера к соединению услуг

Доверительные отношения соединения между провайдером и APNs также установлены через TLS одноранговая аутентификация. Процедура подобна описанному в Доверии Службы к подключению устройства. Провайдер инициирует соединение TLS, получает сертификат сервера от APNs и проверяет тот сертификат. Тогда провайдер отправляет свой сертификат провайдера APNs, проверяющему его на его конце. Как только эта процедура завершена, безопасное соединение TLS было установлено; APNs теперь удовлетворен, что соединение было сделано законным провайдером.

Provider-to-service connection trust

Обратите внимание на то, что соединение провайдера допустимо для поставки только одному определенному приложению, идентифицированный темой (свяжите ID), указанный в сертификате. APNs также поддерживает список аннулированных сертификатов; если сертификат провайдера находится в этом списке, APNs может аннулировать управление имуществом по доверенности провайдера (т.е. отказаться от соединения).

Маркерная генерация и рассредоточение

Приложения должны зарегистрироваться для получения удаленных уведомлений; это обычно делает это правильно после того, как это будет установлено на устройстве. (Эта процедура описана в Планировании, Регистрации и Обработке Уведомлений.) Система получает регистрационный запрос от приложения, соединяется с APNs и передает запрос. APNs генерирует маркер устройства использование информации, содержавшейся в уникальном сертификате устройства. Маркер устройства содержит идентификатор устройства. Это тогда шифрует маркер устройства с маркерным ключом и возвращает его устройству.

Token generation and dispersal

Устройство возвращает маркер устройства приложению запроса как NSData объект. Приложение должно тогда поставить маркер устройства своему провайдеру или в двоичном или в шестнадцатеричном формате. Рисунок 3-3 также иллюстрирует маркерную последовательность генерации и рассредоточения, но кроме того показывает роль клиентского приложения в предоставлении его провайдера с маркером устройства.

Рисунок 3-3  , Совместно использующий маркер устройства
Sharing the device token

Форма этой фазы маркерного доверия гарантирует, что только APNs генерирует маркер, который это будет позже соблюдать, и это может убедиться, что маркер, врученный ему устройством, является тем же маркером, который это ранее настроило для того определенного устройства — и только для того устройства.

Маркерное доверие (уведомление)

После того, как система получает маркер устройства из APNs, как описано в Маркерной Генерации и Рассредоточении, это должно предоставить APNs маркер каждый раз, когда это соединяется с ним. APNs дешифрует маркер устройства и проверяет это, маркер был сгенерирован для соединительного устройства. Для проверки APNs гарантирует, что идентификатор устройства, содержавшийся в маркере, соответствует идентификатор устройства в сертификате устройства.

Каждое уведомление, которое провайдер отправляет в APNs для поставки устройству, должно сопровождаться маркером устройства, который это получило из приложения на том устройстве. APNs дешифрует маркер с помощью маркерного ключа, таким образом гарантируя, что уведомление допустимо. Это тогда использует устройство ID, содержавшийся в маркере устройства для определения устройства назначения для уведомления.

Token trust

Доверительные компоненты

Для поддержки модели обеспечения безопасности для APNs провайдеры и устройства должны обладать определенными сертификатами, сертификатами центра сертификации (CA) или маркерами.

  • Провайдер: Каждый провайдер требует уникального сертификата провайдера и частного криптографического ключа для проверки их соединения с APNs. Этот сертификат, настроенный Apple, должен идентифицировать определенную тему, опубликованную провайдером; темой является пакет ID клиентского приложения. Для каждого уведомления провайдер должен предоставить APNs маркером устройства идентификация целевого устройства. Провайдер может дополнительно хотеть проверить службу, которую он подключает к использованию общедоступного сертификата сервера, предоставленного сервером APNs.

  • Устройство: система использует общедоступный сертификат сервера, переданный ему APNs для аутентификации службы, с которой это соединилось. Это имеет уникальный закрытый ключ и сертификат, который это использует, чтобы аутентифицировать себя к службе и установить соединение TLS. Это получает сертификат устройства и ключ во время активации устройства и хранит их в цепочке для ключей. Система также содержит свой определенный маркер устройства, который она получает во время процесса соединения услуг. Каждое зарегистрированное клиентское приложение ответственно за поставку этого маркера к его контент-провайдеру.

Серверы APNs также имеют необходимые сертификаты, сертификаты CA и криптографические ключи (частный и общедоступный) для проверки соединений и идентификационных данных провайдеров и устройств.

Полезная нагрузка уведомления

Каждое удаленное уведомление включает полезную нагрузку. Полезная нагрузка содержит информацию о том, как система должна предупредить пользователя, а также любые пользовательские данные, что Вы обеспечиваете. В iOS 8 и позже, максимальный размер допускал полезную нагрузку уведомления, 2 килобайта; служба Apple Push Notification отказывается от любого уведомления, превышающего этот предел. (До iOS 8 и в OS X, максимальный размер полезной нагрузки составляет 256 байтов.)

Для каждого уведомления составьте объект словаря JSON (как определено RFC 4627). Этот словарь должен содержать другой словарь, идентифицированный ключом aps. aps словарь может содержать одно или более свойств, указывающих следующие пользовательские типы уведомления:

aps словарь может также содержать content-available свойство. content-available свойство со значением 1 позволяет удаленному уведомлению действовать как «тихое» уведомление. Когда тихое уведомление поступает, iOS будит Ваше приложение в фоновом режиме так, чтобы можно было получить новые данные от сервера или сделать обработку справочной информации. Пользователям не говорят о новой или измененной информации, следующей из тихого уведомления, но они могут узнать об этом в следующий раз, когда они открывают Ваше приложение.

Для поддержки тихих удаленных уведомлений добавьте remote-notification оцените UIBackgroundModes массив в Вашем Info.plist файл. Для узнавания больше об этом массиве посмотрите UIBackgroundModes.

Если целевое приложение не работает, когда уведомление поступает, предупредительное сообщение, звук, или значение значка играется или показывается. Если приложение работает, система поставляет уведомление делегату приложения как NSDictionary объект. Словарь содержит соответствующие объекты списка свойств Какао (плюс NSNull).

Провайдеры могут указать пользовательские значения полезной нагрузки вне зарезервированного Apple aps пространство имен. Пользовательские значения должны использовать JSON структурированные и типы примитивов: словарь (объект), массив, строка, число и булевская переменная. Вы не должны включать информацию о клиентах (или никакие уязвимые данные) как пользовательские данные полезной нагрузки. Вместо этого используйте его в таких целях как установка контекста (для пользовательского интерфейса) или внутренние метрики. Например, когда провайдер отправил уведомление, пользовательское значение полезной нагрузки могло бы быть идентификатором разговора для использования клиентским приложением мгновенного сообщения или идентификации метки времени. Любое действие, связанное с предупредительным сообщением, не должно быть разрушительным — например, оно не должно удалять данные по устройству.

Таблица 3-1 перечисляет ключи и математические ожидания aps полезная нагрузка.

Табличные 3-1  Ключи и значения aps словарь

Ключ

Тип значения

Комментарий

alert

строка или словарь

Если это свойство включено, система выводит на экран стандартное предупреждение. Можно указать строку как значение alert или словарь как его значение. При указании строки это становится текстом сообщения предупреждения с двумя кнопками: Близко и Представление. Если пользователь касается Представления, приложение запускается.

Также можно указать словарь как значение alert. Посмотрите Таблицу 3-2 для описаний ключей этого словаря.

badge

число

Число для отображения как значок значка приложения.

Если это свойство отсутствует, значок не изменяется. Для удаления значка установите значение этого свойства к 0.

sound

строка

Имя звукового файла в комплекте приложений. Звук в этом файле играется как предупреждение. Если звуковой файл не существует или default указан как значение, предупредительный звук по умолчанию играется. Аудио должно быть в одном из форматов аудиоданных, которые совместимы с системными звуками; посмотрите Подготовку Пользовательских Предупредительных Звуков для подробных данных.

content-available

число

Предоставьте этому ключу значение 1 указать, что новое содержание доступно. Включая этот ключ и средние значения значения, что, когда Ваше приложение запускается в фоновом режиме или возобновляется, application:didReceiveRemoteNotification:fetchCompletionHandler: вызывается.

(Приложения киоска, как гарантируют, будут в состоянии получить по крайней мере одно нажатие с этим ключом на 24-часовое окно.)

Таблица 3-2 перечисляет ключи и математические ожидания для alert словарь.

  Свойства Table 3-2 Child alert свойство

Ключ

Тип значения

Комментарий

title

строка

Короткая строка, описывающая цель уведомления. Часы Apple выводят на экран эту строку как часть интерфейса уведомления. Эта строка выведена на экран только кратко и должна быть обработана так, чтобы она могла быть понята быстро. Этот ключ был добавлен в iOS 8.2.

body

строка

Текст предупредительного сообщения.

title-loc-key

строка или null

Ключ к заголовку представляет в виде строки в Localizable.strings файл для текущей локализации. Строка ключа может быть отформатирована с %@ и %n$@ спецификаторы для взятия переменных, указанных в title-loc-args массив. Посмотрите Локализованные Отформатированные строки для получения дополнительной информации. Этот ключ был добавлен в iOS 8.2.

title-loc-args

массив строк или null

Значения переменной строки для появления вместо спецификаторов формата в title-loc-key. Посмотрите Локализованные Отформатированные строки для получения дополнительной информации. Этот ключ был добавлен в iOS 8.2.

action-loc-key

строка или null

Если строка указана, система выводит на экран предупреждение, включающее кнопки Close и View. Строка используется в качестве ключа, чтобы заставить локализованную строку в текущей локализации использовать для заголовка правильной кнопки вместо «Представления». Посмотрите Локализованные Отформатированные строки для получения дополнительной информации.

loc-key

строка

Ключ к предупредительной строке сообщения в a Localizable.strings файл для текущей локализации (который установлен предпочтением языка пользователя). Строка ключа может быть отформатирована с %@ и %n$@ спецификаторы для взятия переменных, указанных в loc-args массив. Посмотрите Локализованные Отформатированные строки для получения дополнительной информации.

loc-args

массив строк

Значения переменной строки для появления вместо спецификаторов формата в loc-key. Посмотрите Локализованные Отформатированные строки для получения дополнительной информации.

launch-image

строка

Имя файла файла образа в комплекте приложений; это может включать расширение или опустить его. Когда пользователи касаются кнопки действий или перемещают ползунок действия, изображение используется в качестве изображения запуска. Если это свойство не указано, система ни один использование предыдущий снимок, использует изображение, идентифицированное UILaunchImageFile введите приложение Info.plist файл, или отступает к Default.png.

Это свойство было добавлено в iOS 4.0.

Локализованные отформатированные строки

Можно вывести на экран локализованные предупредительные сообщения двумя способами:

  • Сервер, порождающий уведомление, может локализовать текст; чтобы сделать это, это должно обнаружить текущее языковое предпочтение, выбранное для устройства (см. Передачу Провайдера Текущее языковое Предпочтение (Удаленные Уведомления)).

  • Клиентское приложение может сохранить предупредительные строки сообщения в своем пакете, переведенном для каждой локализации, которую оно поддерживает. Провайдер включает loc-key и loc-args ключи aps словарь полезной нагрузки уведомления. (Для строк заголовка это включает title-loc-key и title-loc-args ключи в aps словаре.), Когда устройство получает уведомление (принимающий приложение не работает), оно использует их aps- свойства словаря, чтобы найти и отформатировать строку локализовали для текущего языка, который она тогда выводит на экран пользователю.

Вот то, как та вторая опция работает в немного большем количестве подробности.

Приложение может интернационализировать ресурсы, такие как изображения, звуки и текст для каждого языка, который это поддерживает, Интернационализация собирает ресурсы и помещает их в подкаталог пакета с именем с двумя частями: код языка и расширение .lproj (например, fr.lproj). Программно выведенные на экран локализованные строки помещаются в вызванный файл Localizable.strings. Каждая запись в этом файле имеет ключ и значение локализованной строки; строка может иметь спецификаторы формата для замены значений переменных. Когда приложение просит определенный ресурс — скажем локализованная строка — это получает ресурс, локализующийся для языка, в настоящее время выбираемого пользователем. Например, если бы предпочтительный язык является французским, соответствующее строковое значение для предупредительного сообщения было бы выбрано от Localizable.strings в fr.lproj каталог в комплекте приложений. (Приложение выполняет этот запрос через NSLocalizedString макрос.)

Для создания этой расчетной организации давайте рассмотрим пример. Провайдер указывает следующий словарь как значение предупредительного свойства:

"alert" : {
    "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
"loc-args" : [ "Jenna", "Frank"]
}

Когда устройство получает уведомление, оно использует "GAME_PLAY_REQUEST_FORMAT" как ключ для поиска связанного строкового значения в Localizable.strings файл в .lproj каталог для текущего языка. Принятие текущей локализации имеет a Localizable.strings запись, такая как это:

"GAME_PLAY_REQUEST_FORMAT" = "%@ and %@ have invited you to play Monopoly";

устройство выводит на экран предупреждение с сообщением “Дженна, и Франк пригласили Вас играть Монополию”.

В дополнение к спецификатору формата %@, Вы можете %n$@ спецификаторы формата для позиционной замены строковых переменных. N является индексом (начиная с 1) значения массива в loc-args занимать место. (Существует также %% спецификатор для выражения знака процента (%).) Поэтому, если запись в Localizable.strings это:

"GAME_PLAY_REQUEST_FORMAT" = "%2$@ and %1$@ have invited you to play Monopoly";

устройство выводит на экран предупреждение с сообщением “Франк, и Дженна пригласили Вас играть Монополию”.

Для полного примера полезной нагрузки уведомления, использующей loc-key и loc-arg свойства, посмотрите Примеры Полезных нагрузок JSON. Для узнавания больше об интернационализации посмотрите Руководство по Интернационализации и Локализации. Строковое форматирование обсуждено в Форматировании Строковых Объектов в Строковом Руководстве по программированию.

Примеры полезных нагрузок JSON

Следующие примеры части полезной нагрузки уведомлений иллюстрируют практическое применение свойств, перечисленных в Таблице 3-1. Свойства с «высшей точкой» на ключевое имя являются примерами пользовательских данных полезной нагрузки.

Пример 1. Следующая полезная нагрузка имеет aps словарь с простой, рекомендуемой формой для предупредительных сообщений с предупредительными кнопками по умолчанию (Близко и Представление). Это использует строку в качестве значения alert вместо словаря. Эта полезная нагрузка также имеет пользовательское свойство массива.

{
    "aps" : { "alert" : "Message received from Bob" },
    "acme2" : [ "bang",  "whiz" ]
}

Пример 2. Полезная нагрузка в примере использует aps словарь, чтобы запросить, чтобы устройство вывело на экран предупредительное сообщение с кнопкой Close слева и локализованный заголовок для кнопки «действия» на правой стороне предупреждения. В этом случае «PLAY» используется в качестве ключа в Localizable.strings файл для в настоящее время выбираемого языка для получения локализованного эквивалента «Play». aps словарь также запрашивает, чтобы значок приложения был под маркой с номером 5. На Часах Apple ключ заголовка предупреждает пользователя к новому запросу.

{
    "aps" : {
        "alert" : {
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        },
        "badge" : 5,
    },
    "acme1" : "bar",
    "acme2" : [ "bang",  "whiz" ]
}

Пример 3. Полезная нагрузка в этом примере указывает, что устройство должно вывести на экран предупредительное сообщение с обеими кнопками Close и View. Это также запрашивает, чтобы значок приложения был под маркой с номером 9 и что связанный предупредительный звук играться, когда поставлено уведомление.

{
    "aps" : {
        "alert" : "You got your emails.",
        "badge" : 9,
        "sound" : "bingbong.aiff"
    },
    "acme1" : "bar",
    "acme2" : 42
}

Пример 4. Полезная нагрузка в этом примере использует loc-key и loc-args дочерние свойства alert словарь, чтобы выбрать отформатированную локализованную строку от пакета приложения и заменить значениями переменной строки (loc-args) в надлежащих местах. Это также указывает пользовательский звук и включает пользовательское свойство.

{
   "aps" : {
     "alert" : {
            "loc-key" : "GAME_PLAY_REQUEST_FORMAT",
            "loc-args" : [ "Jenna", "Frank"]
        },
     "sound" : "chime.aiff"
   },
   "acme" : "foo"
}

Пример 5. Полезная нагрузка в этом примере включает пользовательские действия уведомления. Обратите внимание на то, что присутствие дополнительного actions массив не влияет на действие по умолчанию, связанное с предупреждением.

{
   "aps" : {
      "alert” : {
         “body” : "Acme message received from Johnny Appleseed”,
         “action-loc-key” : “VIEW”,
         "actions" : [
            {
               “id" : “delete",
               "title" : "Delete"
            },
            {
               “id" : “reply-to”,
               "loc-key" : “REPLYTO”,
               "loc-args" : [“Jane"]
            }
         ]
      }
      "badge" : 3,
      "sound" : “chime.aiff"
   },
   "acme-account" : "jane.appleseed@apple.com",
   "acme-message" : "message123456"
}