Push-уведомления в Kit Chat для iOS
Voximplant Kit отправляет alert push-уведомления о новых входящих сообщениях в чате. Уведомления доставляются через APNs и отображаются системой автоматически. Приложению не нужно формировать push-уведомления самостоятельно.
В этой статье описано, как зарегистрировать push-токен, настроить обработку уведомлений в активном приложении, изменить содержимое уведомлений и протестировать их.
Перед началом работы настройте push-уведомления в Voximplant Kit, как описано в инструкции.
Содержание
Структура push-уведомления
Пример payload, который приходит от Voximplant Kit:
aps— системный блок APNs, необходимый для получения и отображения alert push-уведомления со стандартным звуком. Полеmutable-content: 1позволяет изменить уведомление перед показом через Notification Service Extension.
voximplant_im— блок данных от Voximplant Kit:client_id— идентификатор клиента, которому предназначено push-уведомлениеmessage_uuid— UUID сообщенияwith_attachments— флаг наличия вложений
Регистрация push-токена
Чтобы приложение получало уведомления, запросите у пользователя разрешение на показ уведомлений и зарегистрируйте APNs-токен в Voximplant Kit.
Запрос разрешения и получение токена
Регистрация токена в SDK
Значение параметра isDevelopment зависит от типа сборки приложения:
true— сборка через Xcode в режиме debug, токен получен из sandbox APNsfalse— сборка для App Store или TestFlight, токен получен из production APNs
Чтобы прекратить получение уведомлений, используйте VIKitChatUI.unregisterPushToken(_:isDevelopment:completion:) аналогичным образом.
Обработка уведомлений
Управление уведомлениями в активном приложении
Когда приложение активно, iOS по умолчанию не отображает push-уведомления, если делегат UNUserNotificationCenterDelegate не назначен или метод userNotificationCenter(_:willPresent:withCompletionHandler:) не реализован.
Если уведомления нужны в активном приложении, но не на всех экранах, назначьте делегат UNUserNotificationCenter и задайте логику в методе userNotificationCenter(_:willPresent:withCompletionHandler:).
В примере ниже уведомления отображаются всегда, кроме случая, когда VIKitChatViewController отображается на экране:
Payload push-уведомления от Voximplant Kit содержит ключ voximplant_im. Этот ключ можно использовать для фильтрации, если приложение получает push-уведомления из разных источников.
Кастомизация уведомлений
Кастомизация уведомлений выполняется через Notification Service Extension. Расширение получает push-уведомление до того, как iOS покажет уведомление пользователю, и позволяет изменить отображаемый заголовок, текст, звук, badge или другие параметры.
Доступные варианты кастомизации:
Изменение заголовка и текста
Локализация
Управление звуком
Управление badge
Использование данных из payload push-уведомления
Выполнение асинхронного кода
Чтобы изменить содержимое уведомлений, создайте отдельный таргет в Xcode: File > New > Target > Notification Service Extension. Notification Service Extension получает push-уведомление до того, как iOS покажет уведомление пользователю, и позволяет изменить отображаемое содержимое.
Ограничения Notification Service Extension:
Примерно 30 секунд на обработку. После этого вызывается UNNotificationServiceExtension.serviceExtensionTimeWillExpire()
Примерно 24 МБ памяти
Отдельный процесс. Для общих данных с приложением используется App Group
Если в коде Notification Service Extension выполнение завершается через return без вызова contentHandler, то уведомление не отобразится.
Если Notification Service Extension уже содержит проверки для других типов push-уведомлений, убедитесь, что push-уведомления от Voximplant Kit с ключом
voximplant_imв payload проходят эти проверки и для них вызываетсяcontentHandler. Иначе уведомление не отобразится пользователю.
В базовом варианте Notification Service Extension получает push-уведомление от Voximplant Kit и изменяет содержимое уведомления, например заменяет текст:
Другие варианты кастомизации
Локализация
Для локализации текста уведомления используется NSLocalizedString, который подставляет значение из .strings-файла таргета Notification Service Extension в зависимости от языка устройства:
Отключение звука
По умолчанию push-уведомление от Voximplant Kit приходит со звуком. Чтобы отключить звук, используйте следующий код:
При включенном режиме Не беспокоить iOS заглушает звук уведомлений независимо от этой настройки.
Управление badge
Badge — это числовой счетчик на иконке приложения. Для работы с badge между Notification Service Extension и приложением необходим общий App Group:
Использование данных из payload
Данные из payload push-уведомления можно использовать для изменения уведомления, которое увидит пользователь. В примере ниже при наличии вложений (with_attachments: 1) к уведомлению добавляется иконка:
Выполнение асинхронного кода
Notification Service Extension поддерживает выполнение асинхронного кода, например сетевых запросов. В примере ниже загружается изображение для отображения в уведомлении:
В данном примере реализации, если запрос не успеет выполниться за ~30 секунд, serviceExtensionTimeWillExpire() передаст bestAttemptContent с немодифицированным содержимым. Пользователь увидит уведомление без изображения.
Тестирование push-уведомлений
Перед интеграцией рекомендуется протестировать push-уведомления с помощью Apple Push Notifications Console, подробнее см. в документации. Консоль позволяет отправить APNs push с заданным payload на устройство по его токену.
Это помогает проверить поведение приложения с текущей кодовой базой при получении новых push-уведомлений и понять, требуются ли изменения.
Для тестирования можно использовать следующий payload. При необходимости замените значения на тестовые данные:
Миграция с предыдущих версий
В версиях SDK до 1.6.0 для кастомизации уведомлений использовались API SDK. Начиная с версии 1.6.0 эти API устарели (deprecated).
При обновлении выполните следующие действия:
Удалите вызовы
configureChatNotification(configuration:)иhandlePushNotification(_:completion:).Удалите использование
VINotificationConfiguration.Удалите обработку push-уведомлений, связанных с чатом, в application(_:didReceiveRemoteNotification:fetchCompletionHandler:).
Замените
VIPushNotificationErrorна VIPushTokenError.Для кастомизации уведомлений используйте Notification Service Extension, как описано выше.