TL; DR Создание расширения службы уведомлений iOS является решением. Документация OneSignal упоминает это , но гораздо менее подробно.
Когда Apple представила критические оповещения, они изменили параметр sound
, который передается с полезной нагрузкой APNS. Ранее sound
был всего лишь строкой. Например:
{
“aps” : {
“sound” : “critical-alert-sound.wav”
}
}
С критическими оповещениями это словарь. Пример:
{
“aps” : {
“sound” : {
“critical”: 1,
“name”: “critical-alert-sound.wav”,
“volume”: 1.0
}
}
}
Строковая версия все еще действительна и используется для некритических предупреждений. Основываясь на логическом выводе и тестировании, при передаче параметра sound
в OneSignal он поддерживает только начальную «строковую» версию. Когда OneSignal отправляет полезную нагрузку в Apple, он передает ее в виде строки, поэтому даже попытка передать звуковой словарь в OneSignal не будет работать, поскольку он анализируется до того, как он попадает в Apple. К тому времени, как Apple снова свяжется с вашим устройством, словарь исчезнет, что не позволит устройству когда-либо распознать его как критическое оповещение.
Именно здесь входит расширение службы уведомлений . Из документации Apple:
Объект UNNotificationServiceExtension предоставляет точку входа для расширения приложения службы уведомлений, которое позволяет настраивать содержимое удаленного уведомления до его доставки пользователю. Расширение приложения службы уведомлений не имеет собственного пользовательского интерфейса. Вместо этого он запускается по требованию, когда уведомление соответствующего типа доставляется на устройство пользователя. Это расширение используется для изменения содержимого уведомления или загрузки содержимого, связанного с расширением.
Короче говоря, вы можете перехватить уведомление JSON полезной нагрузки от Apple и изменить его непосредственно перед тем, как его увидит пользователь. .
Для правильной передачи информации на устройство из OneSignal-> Apple-> Device вам необходимо:
1) Установить значение additional_data_is_root_payload
в Ваш аккаунт OneSignal на true
. Это делается с помощью Обновления вызова API приложения в OneSignal. Для этого я использовал Почтальон . Чтобы было понятно, это нужно сделать один раз, это не нужно повторять каждый раз, когда вы совершаете вызов API уведомлений.
2) В полезной нагрузке OneSignal API установите параметр mutable_content
до true
.
Как упоминалось выше, вы можете использовать значения в параметре OneSignal data
полезной нагрузки. Полезная нагрузка data
- это открытое поле, которое может использоваться для любой дополнительной информации, которую вы хотите передать через поток OneSignal-> Apple-> Device, и доставляется на устройство / приложение, которое вы затем можете анализировать по своему усмотрению. В моем примере мы используем:
"data": {"CRITICAL_ALERT":"YES"}
Полезная нагрузка данных является произвольной, она просто должна соответствовать проверкам, которые вы делаете в Расширении службы уведомлений.
Затем мы создаем наш Расширение службы уведомлений в XCode. Здесь есть несколько замечательных пошаговых инструкций по созданию расширения . Это делается с помощью XCode, поэтому, если вы создаете собственное приложение, это просто делается с помощью вашего проекта XCode для вашего приложения. Если вы используете такую среду, как Adobe AIR, она немного сложнее, и я подробно опишу это в другом посте. Помните, что расширение службы уведомлений - это, по сути, отдельное «приложение», связанное с родительским приложением. Он скомпилирован в файл с расширением 'appex' и, несмотря на то, что он представляет собой отдельный двоичный файл, он специально предназначен для вашего родительского приложения.
После создания расширения ваш проект XCode будет иметь файл с именем NotificationService.swift
с классом, в котором есть метод didReceive
. Затем мы добавили этот код:
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
if ((request.content.userInfo["CRITICAL_ALERT"] as? String) == "YES"){
bestAttemptContent.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
}
contentHandler(bestAttemptContent)
}
Вы можете видеть, что мы проверяем полезную нагрузку данных (request.content.userInfo
), чтобы увидеть, установлен ли ключ CRITICAL_ALERT
со значением YES
. Если это так, мы добавляем «критический звук» в уведомление, которое фактически превращает его в критическое предупреждение. В этом случае мы сохранили простоту с помощью функции defaultCriticalSound, но вы также можете использовать critSoundNamed, если вы хотите определить свой собственный звук. Вы также можете передать звук, который вы хотите использовать для оповещения, через полезную нагрузку данных, а затем проанализировать его и добавить его в расширение службы уведомлений, если вы хотите создать определенные c звуки для определенных c уведомлений.
На этом этапе мы протестировали это через интерфейс OneSignal после того, как развернули приложение на наших устройствах. Это можно получить, войдя в свою учетную запись OneSignal, а затем перейдя в «Сообщения» -> «Новый Pu sh» и выбрав устройства, на которые вы хотите отправить pu sh по адресу:
Надеемся, что это полезно для других, использующих OneSignal для критических оповещений (и, надеюсь, они скоро обновят свою систему, чтобы больше не нуждаться в расширении службы уведомлений).