Перейти к содержанию

Отслеживание доставки сообщений в iOS

В Pushwoosh есть API-метод, который отслеживает доставку push-уведомлений. iOS-приложения не поддерживают этот метод «из коробки», поскольку push-уведомления в iOS обрабатываются операционной системой, а не Pushwoosh SDK. Вы можете добавить отслеживание доставки, добавив Notification Service Extension в ваш проект. На этой странице показано, как реализовать отслеживание доставки сообщений для iOS-приложений.

Добавление Notification Service Extension

Anchor link to
  1. В Xcode выберите File > New > Target… (Файл > Новый > Цель…)

  2. Выберите Notification Service Extension и нажмите Next (Далее).

Окно выбора шаблона цели в Xcode с выбранным Notification Service Extension
  1. Введите название продукта и нажмите Finish (Завершить).
  1. Нажмите Cancel (Отмена) в запросе Activate scheme (Активировать схему).
Запрос на активацию схемы с выделенной кнопкой Cancel

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

Зависимости для Notification Service Extension (только CocoaPods)

Anchor link to

Если вы используете Swift Package Manager для управления зависимостями, вы можете пропустить этот шаг, так как зависимости добавляются автоматически.

Откройте ваш Podfile и добавьте зависимость для цели (target):

Podfile
target 'NotificationServiceExtension' do
use_frameworks!
pod 'PushwooshXCFramework'
end

Выполните следующие команды в терминале, чтобы установить зависимости:

Terminal window
rm -rf Podfile.lock
pod deintegrate
pod setup
pod repo update
pod install

Добавление кода для отслеживания событий доставки сообщений

Anchor link to

Сделайте ваше расширение подклассом PushwooshNotificationServiceExtension. Пустого подкласса достаточно: Pushwoosh автоматически отправляет событие о доставке сообщения, устанавливает значок (badge), загружает медиавложения и обрабатывает резервный вариант при истечении времени ожидания.

Замените сгенерированное содержимое вашего файла NotificationService:

import UserNotifications
import PushwooshFramework
class NotificationService: PushwooshNotificationServiceExtension {}

Начиная с версии 7.1.0, расширение наследует Pushwoosh_APPID (и другие ключи Pushwoosh_*) из Info.plist основного приложения, поэтому вам больше не нужно дублировать его в расширении. Добавляйте Pushwoosh_APPID в Info.plist расширения, только если вы хотите переопределить значение основного приложения:

NotificationService/Info.plist
<key>Pushwoosh_APPID</key>
<string>XXXXX-XXXXX</string>

App Group (значок и обратный прокси)

Anchor link to

App Group, общая для приложения и расширения, необходима для синхронизации счетчика значка (badge) и для чтения настроек обратного прокси (reverse-proxy), которые хранит основное приложение.

  1. Добавьте возможность App Groups к цели (target) расширения и включите ту же группу, что и в основном приложении. Это обязательно — без общего контейнера счетчик значка и настройки обратного прокси не могут быть синхронизированы.

  2. Укажите имя App Group. Как и Pushwoosh_APPID, расширение наследует PW_APP_GROUPS_NAME из Info.plist основного приложения начиная с версии 7.1.0, поэтому, если вы уже установили его там для значков, вам не нужно добавлять его в расширение. Устанавливайте его в Info.plist расширения только для переопределения значения основного приложения или предоставляйте его программно, переопределив pushwooshAppGroupsName.

App Info.plist
<key>PW_APP_GROUPS_NAME</key>
<string>group.com.example.app</string>

Настройка уведомления (необязательно)

Anchor link to

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

Установите App Group программно вместо использования ключа в Info.plist:

override func pushwooshAppGroupsName() -> String? {
"group.com.example.app"
}

Выполните асинхронную подготовку перед тем, как Pushwoosh обработает push-уведомление — например, предварительную загрузку медиа для Push Stories — без переопределения стандартного didReceive. Вызовите completion ровно один раз в главном потоке:

override func pushwooshPrepare(for request: UNNotificationRequest,
completion: @escaping () -> Void) {
// async work here
completion()
}

Измените содержимое перед его отображением, переопределив didReceive. Вызовите super с вашим собственным обработчиком содержимого, измените содержимое внутри него, а затем передайте его исходному обработчику:

override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
super.didReceive(request) { content in
let mutable = (content.mutableCopy() as? UNMutableNotificationContent) ?? content
// customize `mutable` here
contentHandler(mutable)
}
}

Устаревшая интеграция

Anchor link to

Этот низкоуровневый API управляет той же обработкой (событие о доставке, значок, вложение) из обычного UNNotificationServiceExtension:

import UserNotifications
import PushwooshFramework
class NotificationService: UNNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
PWNotificationExtensionManager.sharedManager()
.handleNotificationRequest(request, contentHandler: contentHandler)
}
}

Поделитесь с нами своим мнением

Anchor link to

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