Конфигурирование уведомлений нажатия Safari

В OS X v10.9 и позже, можно диспетчеризировать Уведомления Нажатия Safari от веб-сервера непосредственно пользователям OS X при помощи Apple Push Notification service (APNs). Чтобы не быть перепутанными с локальными уведомлениями, уведомления нажатия могут достигнуть Ваших пользователей независимо от того, открыты ли Ваш веб-сайт или Safari.

../Art/safari_notifs_rev_2x.png../Art/safari_notifs_rev_2x.png

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

После получения уведомления пользователь может щелкнуть по нему для открытия веб-страницы выбора в Safari.

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

Вы обязаны регистрироваться в Сертификатах, разделе Identifiers & Profiles Задействованного Центра для отправки уведомлений нажатия. Регистрация требует лицензии разработчика iOS или лицензии разработчика Mac.

При регистрации включайте следующую информацию:

Процесс регистрации похож на форму на рисунке 2-1.

  Регистр рисунка 2-1 как провайдер нажатия с Apple

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

Аннулирование сертификата

Если Вы злоупотребляете службой уведомления нажатия или не удаетесь придерживаться инструкций Apple, для защиты пользователей OS X Apple сохраняет право отменить сертификат. Аннулирование сертификата приводит к неспособности выпустить новые уведомления нажатия.

Если Ваш сертификат нажатия поставился под угрозу, можно вручную отменить его от серверов Apple в Сертификатах, разделе Identifiers & Profiles Задействованного Центра.

Создание пакета нажатия

Когда пользователя просят относительно разрешения получить уведомления нажатия, Safari просит у Вашего веб-сервера пакет. Пакет содержит данные, использующиеся уведомлением UI, такой как Ваше имя веб-сайта и значок, а также криптографическая подпись. Подпись проверяет, что Ваше уведомление не было прервано атакой «человек посередине» и что это действительно прибывает из доверяемого источника: Вы.

Вы создаете пакет нажатия первым заполнением папки с определенным набором файлов. Пакет нажатия содержит веб-сайт словарь JSON, ряд значков (называемый iconset), декларация и подпись. Перечисление 2-1 иллюстрирует полную файловую структуру пакета нажатия.

  Файловая структура перечисления 2-1 пакета нажатия

BayAirlines.pushpackage/
    icon.iconset/
        icon_16x16.png
        icon_16x16@2x.png
        icon_32x32.png
        icon_32x32@2x.png
        icon_128x128.png
        icon_128x128@2x.png
    manifest.json
    signature
    website.json

После того, как требуемые файлы существуют, сжимают папку в архив ZIP для создания завершенного пакета нажатия. Пакет нажатия может или быть подан в качестве статического файла или сгенерирован динамично на пользователя (как долго как Content-type соответствия заголовка application/zip). Возвратите пакет нажатия из своего веб-сервера в расположении, которое Вы указываете в Загрузке Вашего Пакета Веб-сайта.

Веб-сайт словарь JSON

Веб-сайт словарь JSON называют website.json содержит метаданные, используемые Safari и Центром Уведомления, чтобы представить UI пользователю и связаться с Вашим веб-сервисом.

Ключи веб-сайта словарь JSON, показанный в Перечислении 2-2, описаны в Таблице 2-1.

Перечисление 2-2  демонстрационный допустимый website.json файл

{
    "websiteName": "Bay Airlines",
    "websitePushID": "web.com.example.domain",
    "allowedDomains": ["http://domain.example.com"],
    "urlFormatString": "http://domain.example.com/%@/?flight=%@",
    "authenticationToken": "19f8d7a6e9fb8a7f6d9330dabe",
    "webServiceURL": "https://example.com/push"
}
Таблица 2-1  Позволенные ключи в website.json файле

Ключ

Описание

websiteName

Имя веб-сайта. Это - заголовок, используемый в Центре Уведомления.

websitePushID

Нажатие Веб-сайта ID, как указано в Вашей регистрации с Задействованным Центром.

allowedDomains

Массив веб-сайтов, которым позволяют запросить разрешение от пользователя.

urlFormatString

URL для движения в то, когда щелкают по уведомлению. Использовать %@ как заполнитель для параметров Вы заполняете при поставке уведомления. Этот URL должен использовать http или https схема; иначе, это недопустимо.

authenticationToken

Строка, помогающая Вам идентифицировать пользователя. Это включено в более поздние запросы к Вашему веб-сервису. Эта строка должна 16 символов или больше.

webServiceURL

Расположение раньше выполняло запросы к Вашему веб-сервису. Запаздывающая наклонная черта должна быть опущена.

Iconset

iconset является вызванным каталогом icon.iconset это содержит изображения PNG в переменных размерах. Изображения в Вашем iconset заполняют значки, выведенные на экран пользователю в подсказке разрешения, Центре Уведомления и самом уведомлении. Поскольку Ваш значок статичен, является ненужным включать его в каждое уведомление нажатия. Вместо этого Ваши значки загружаются один раз с Вашего сервера и сохранены на компьютере пользователя. Значки в наборе значка называют с соглашением, показанным в Перечислении 2-1 с размерностями, которые подразумевает каждое имя.

Декларация

Декларация является названным словарем JSON manifest.json это содержит запись для каждого файла, где локальный путь к файлу является ключом записи, и контрольная сумма файла SHA1 является значением записи; например:

{
    "website.json": "96838c40594f632cc25d7760fa404c728886b3a8",
    "icon.iconset/icon_16x16.png": "865f103703cbb85e1867793e1c798d96a63417e1",
    ...
}

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

Для ручной генерации контрольной суммы SHA1 ввести openssl sha1 <filepath> в Терминальной подсказке. create_manifest функция в присоединенном createPushPackage.php сопутствующий файл (ссылка около начала страницы) выполняет итерации через каждый файл и генерирует контрольную сумму для Вас.

Подпись

Подпись является отсоединенной подписью № 7 PKCS файла манифеста. Подпишите файл манифеста с закрытым ключом, связанным с Вашим веб-сертификатом нажатия, который Вы получили при регистрации в Apple. В PHP можно сделать это с openssl_pkcs7_sign функция. create_signature функция в присоединенном createPushPackage.php сопутствующий файл (ссылка около начала страницы) показывает, как можно сделать это.

Если содержание Вашего пакета нажатия когда-нибудь будет изменяться, то необходимо будет повторно вычислить подпись.

Запрос разрешения

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

Рисунок 2-2  контроль за работой пользователей их полномочия уведомления

Для проверки разрешения выравниваются, пользователь установил для веб-сайта, вызвать window.safari.pushNotification.permission() с Вашим Нажатием Веб-сайта ID как параметр. Этот синхронный вызов возвращает объект полномочий для данного идентификатора путем взгляда в предпочтениях пользователя. Эта функция не связывается с Вашим сервером.

Объект полномочий содержит ключи, как описано в Таблице 2-2.

Таблица 2-2  структура объекта полномочий

Ключ

Описание

permission

Уровень разрешения установлен пользователем; возможные значения:

  • default — Пользователя еще не спросили его или ее разрешение. Если пользователь удаляет разрешение для этого сайта в предпочтениях Safari, это также - значение.

  • granted — Пользователь позволил разрешению для веб-сайта отправлять уведомления нажатия.

  • denied — Пользователь отрицал, что разрешение для веб-сайта отправило уведомления нажатия.

deviceToken

Уникальный идентификатор для пользователя на устройстве. Только настоящее, если permission granted.

Для запроса разрешения отправить пользовательские уведомления нажатия вызвать window.safari.pushNotification.requestPermission(). Запрос разрешения является асинхронным вызовом.

window.safari.pushNotification.requestPermission(url, websitePushID, userInfo, callback);

Описание каждого параметра следующие:

Перечисление 2-3  , Обрабатывающее полномочия для веб-сайта, продвигает уведомления

document.body.onload = function() {
    // Ensure that the user can receive Safari Push Notifications.
    if ('safari' in window && 'pushNotification' in window.safari) {
        var permissionData = window.safari.pushNotification.permission('web.com.example.domain');
        checkRemotePermission(permissionData);
    }
};
 
var checkRemotePermission = function (permissionData) {
    if (permissionData.permission === 'default') {
        // This is a new web service URL and its validity is unknown.
        window.safari.pushNotification.requestPermission(
            'https://domain.example.com', // The web service URL.
            'web.com.example.domain',     // The Website Push ID.
            {}, // Data that you choose to send to your server to help you identify the user.
            checkRemotePermission         // The callback function.
        );
    }
    else if (permissionData.permission === 'denied') {
        // The user said no.
    }
    else if (permissionData.permission === 'granted') {
        // The web service URL is a valid push provider, and the user said yes.
        // permissionData.deviceToken is now available to use.
    }
};

Конфигурирование конечных точек веб-сервиса

Когда веб-страница запрашивает разрешение вывести на экран уведомления нажатия, Запрос HTTP для Ваших учетных данных отправляется в Ваш веб-сервер. Точно так же, когда пользователь изменяет их настройки уведомлений нажатия веб-сайта в Safari или Установках системы, Запрос HTTP отправляется в Ваш веб-сервер. Необходимо сконфигурировать веб-сервис RESTful на сервере для ответа на эти запросы соответственно. Веб-сервис не должен быть размещен на том же сервере (ах) или домене (ах), служащих Вашим веб-страницам.

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

Таблица 2-3  конечная точка веб-сервиса фрагменты URL

Фрагмент

Описание

webServiceURL

URL к Вашему веб-сервису; это совпадает с url параметр в window.safari.pushNotification.requestPermission(). Должен запуститься с https.

version

Версия API. В настоящее время, «v1».

deviceToken

Уникальный идентификатор для пользователя на устройстве.

websitePushID

Нажатие веб-сайта ID.

Загрузка пакета веб-сайта

Когда пользователь позволяет разрешению получить уведомления нажатия, a POST запрос отправлен к следующему URL:

webServiceURL/version/pushPackages/websitePushID

Это POST запрос содержит следующую информацию:

  • В Теле HTTP. Тот же пользовательский информационный объект JSON, передающийся как третий параметр requestPermission() вызвать. Используйте пользовательский информационный словарь для идентификации пользователя.

При обслуживании пакета нажатия возвратиться application/zip для Content-type заголовок.

Регистрация или обновление политики разрешения устройства

Когда пользователи сначала дают разрешение или более позднее изменение их уровни разрешения для Вашего веб-сайта, a POST запрос отправлен к следующему URL:

webServiceURL/version/devices/deviceToken/registrations/websitePushID

Это POST запрос содержит следующую информацию:

  • В HTTP-заголовке. Заголовок Авторизации. Его значение является словом ApplePushNotifications и аутентификационный маркер, разделенный одиночным пробелом. Аутентификационный маркер является тем же маркером, это указано в Вашем пакете website.json файл. Ваш веб-сервис может использовать этот маркер для определения, какой пользователь регистрирует или обновляет их политику разрешения.

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

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

Упущение политики разрешения устройства

Если пользователь удаляет разрешение веб-сайта в предпочтениях Safari, a DELETE запрос отправлен к следующему URL:

webServiceURL/version/devices/deviceToken/registrations/websitePushID

Это DELETE запрос содержит следующую информацию:

  • В HTTP-заголовке. Заголовок Авторизации. Его значение является словом ApplePushNotifications и аутентификационный маркер, разделенный одиночным пробелом. Аутентификационный маркер является тем же маркером, это указано в Вашем пакете website.json файл. Ваш веб-сервис может использовать этот аутентификационный маркер для определения, какой пользователь удаляет их политику разрешения.

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

Журналирование ошибок

Если ошибка происходит, a POST запрос отправлен к следующему URL:

webServiceURL/version/log

Это POST запрос содержит следующую информацию:

  • В Теле HTTP. Словарь JSON, содержащий единственный ключ, названный logs, который содержит массив строк, описывающих произошедшие ошибки.

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

Продвижение уведомлений

Вы отправляете уведомления нажатия клиентам таким же образом, что iOS и приложения OS X продвигают уведомления APNs. Как провайдер уведомления нажатия, Вы связываетесь с APNs по двоичному интерфейсу. Это высокая скорость, интерфейс большой емкости использует проект сокета TCP потоковой передачи с двоичным содержанием. Двоичный интерфейс является асинхронным.

../Art/safari_notifs_2_2x.png../Art/safari_notifs_2_2x.png

Двоичный интерфейс продуктивной среды доступен через gateway.push.apple.com, порт 2195. Не соединяйтесь со средой разработки для отправки Уведомлений Нажатия Safari. Можно установить многократные параллельные соединения с тем же шлюзом или с многократными экземплярами шлюза.

Для каждого интерфейса используйте TLS (или SSL) для установления канала защищенных связей. Сертификат SSL, требуемый для этих соединений, является тем же самым, это настраивается, когда Вы зарегистрировали свое Нажатие Веб-сайта ID в Задействованном Центре. Для установления доверяемых идентификационных данных провайдера представьте этот сертификат APNs во время соединения.

Словарь JSON как тот в Перечислении 2-4 производит уведомление, которое похоже на тот на рисунке 2-3. Объект JSON должен строго соответствовать RFC 4627.

Перечисление 2-4  словарь JSON, показывающий демонстрационную полезную нагрузку уведомления

{
    "aps": {
        "alert": {
            "title": "Flight A998 Now Boarding",
            "body": "Boarding has begun for Flight A998.",
            "action": "View"
        },
        "url-args": ["boarding", "A998"]
    }
}
Рисунок 2-3  получающееся уведомление нажатия

Наиболее удаленный словарь, идентифицирующийся aps ключ, должен содержать другой названный словарь alert. alert словарь может содержать только ключи, перечисленные в Таблице 2-4. Пользовательские ключи не поддерживаются.

Табличная 2-4  структура словаря Предупреждения

Ключ

Описание

title

Требуемый. Заголовок уведомления. (“Рейс A998, Теперь Обшивающий” на рисунке 2-3.)

body

Требуемый. Организация уведомления. (“Обшивка началась для Рейса A998”. на рисунке 2-3.)

action

Дополнительный. Метка кнопки действий, если пользователь устанавливает уведомления для появления как предупреждения. Эта метка должна быть сжатой, такой как «Подробные данные» или “Чтение больше”. Если опущено, значением по умолчанию является «Шоу».

url-args ключ указывает массив значений, соединяющихся с заполнителями в urlFormatString значение Вашего website.json файл. url-args ключ должен быть включен. Число элементов в массиве должно соответствовать число заполнителей в urlFormatString значение и порядок заполнителей в строке Формата ссылки определяют порядок значений, предоставленных url-args массив. Число заполнителей может быть нулем, когда массив должен быть пустым. Однако это - установившаяся практика, чтобы всегда включать по крайней мере один параметр так, чтобы пользователь был направлен к веб-странице, определенной для полученного уведомления.

Для низкоуровневого отказа пакетов уведомления, а также листинга кода того, как отправить уведомление по двоичному интерфейсу, читают Связь Провайдера со Службой Уведомления Нажатия Apple в Локальном и Удаленном Руководстве по программированию Уведомления.

Поиск и устранение неисправностей

Если что-то пойдет не так, как надо в загрузке Вашего пакета нажатия или поставки Ваших уведомлений нажатия, то с конечной точкой журналирования на Вашем веб-сервисе, как описано в Журналировании Ошибок свяжутся с сообщением об ошибке, описывающим ошибку. Таблица 2-5 перечисляет возможные ошибки и шаги, которые можно предпринять для фиксации их.

Таблица 2-5  , Регистрирующая сообщения об ошибках конечной точки

Сообщение об ошибке

Разрешение

authenticationToken должны быть по крайней мере 16 символов.

authenticationToken ключ в Вашем website.json файл должен быть 16 символами или больше. Посмотрите Веб-сайт Словарь JSON.

Загрузка пакета уведомления нажатия перестала работать.

Пакет нажатия не мог быть получен от расположения, указанного в Загрузке Вашего Пакета Веб-сайта.

Извлечение пакета уведомления нажатия перестало работать.

Удостоверьтесь, что Ваш пакет нажатия заархивирован правильно. Посмотрите Создание Пакета Нажатия.

Недостающий файл в пакете уведомления нажатия.

Удостоверьтесь, что Ваш пакет нажатия содержит все файлы, указанные в Создании Пакета Нажатия.

Без вести пропавшие изображения в пакете уведомления нажатия.

Удостоверьтесь, что Ваш пакет нажатия содержит все файлы, указанные в Iconset.

Без вести пропавшие ключа website.json.

Удостоверьтесь что Ваш website.json файл имеет все ключи, перечисленные в Веб-сайте Словарь JSON.

Сериализация JSON в website.json неработающий.

website.json файл в Вашем пакете нажатия не является допустимым JSON. Посмотрите Веб-сайт Словарь JSON.

Верификация подписи пакета нажатия перестала работать.

Декларация не была подписана правильно или была подписана с помощью недопустимого сертификата. Посмотрите Подпись.

Неспособный создать пакет уведомления для пакета уведомления нажатия.

Извлеченный пакет нажатия не мог быть сохранен к диску пользователя.

Неспособный генерировать файл ICNS для пакета уведомления нажатия.

Ваш iconset может иметь уродливый PNGs. Посмотрите Iconset.

Неспособный проанализировать webServiceURL.

Удостоверьтесь что значение для webServiceURL в Вашем website.json файлом является допустимый URL. Посмотрите Веб-сайт Словарь JSON.

Неспособный сохранить пакет уведомления нажатия.

Пакет нажатия не мог быть сохранен к диску пользователя.

urlFormatString должен иметь http или https схема.

Удостоверьтесь что значение для urlFormatString в Вашем website.json файл запускается с http или https. Посмотрите веб-сайт словарь JSON.

Проверка хешей в manifest.json неработающий.

Контрольные суммы SHA1, указанные в Вашем manifest.json файл не вычисляет к их фактическим значениям. См. Декларацию.

Веб-сервис API URL должен быть https.

Удостоверьтесь, что URL в Вашей конечной точке пакета нажатия запускается с https. Посмотрите загрузку Вашего пакета веб-сайта.

webServiceURL должно быть равно URL в вызове к requestPermission.

Двойная проверка, что веб-сервис URL в Вашем вызове JavaScript соответствует веб-сервису URL в Вашем website.json файл. Посмотрите Запрос Разрешения.

websitePushID должно быть равно идентификатору в вызове к requestPermission.

Двойная проверка, что идентификатор в Вашем вызове JavaScript соответствует идентификатор в Вашем website.json файл. Посмотрите Запрос Разрешения.

x не может использоваться в качестве строки формата для URLs.

URL, создаваемый путем вставки полезной нагрузки уведомления url-args значения в заполнителей указаны в пакете нажатия urlFormatString не допустимо, или существует различное число значений, чем заполнители. См. Уведомления Продвижения.

Также проверьте веб-Инспектора на ошибки, которые могли бы произойти в Вашем JavaScript. Чтобы изучить, как использовать веб-Инспектора, считайте Safari веб-инспектор Гуид.