Поддержка критического оповещения на OneSignal не работает - PullRequest
1 голос
/ 21 февраля 2020

У нас возникли проблемы с использованием новой функции iOS Критические оповещения с OneSignal. Приложение, которое мы создали, построено с использованием Apache Flex, а полезные нагрузки уведомлений pu sh компилируются / генерируются через Distriqt ANE и отправляются через OneSignal iOS SDK . Мы были одобрены Apple для критических оповещений, но при попытке отправить полезную нагрузку через OneSignal это не работает.

Команда Distriqt встроила поддержку критических оповещений, что замечательно, но после отправки через OneSignal полезная нагрузка не доставляется успешно и критическое предупреждение не генерируется. Для ясности, обычные уведомления pu sh работают нормально.

OneSignal имеет документацию по критическим оповещениям , хотя она слишком упрощена. Полезная нагрузка , необходимая для запуска критических оповещений на iOS, ясна, но нет способа создать такую ​​полезную нагрузку через OneSignal iOS SDK.

В ссылке , мы выполнили # 1 (Обновить структуру полезных данных приложения OneSignal для iOS) , но # 2 неясно . Как должна выглядеть полезная нагрузка? Предоставленный код не проясняет это. Кроме того, что такое упомянутое «расширение категории уведомлений», и если этот код идентифицирован, что нам нужно сделать в этот момент?

Мы связались с OneSignal и не смогли понять, как успешно создать эту полезную нагрузку. , В документации сказано, что «iOS поддерживает OneSignal SDK», но от их поддержки мы получили:

Unfortunately our SDK is not setup to handle critical alerts.

One user reported he achieved this with our additional data parameter like this:

"data": {"CRITICAL_ALERT":"YES","CRITICAL_PAYLOAD":{"CRITICAL_VOLUME":"1.0","CRITICAL_SOUND":"Alert.wav"}}

Хотя это не работает. Хотя это относительно новая функция, я надеюсь, что кто-то в сообществе преуспел в этом и может помочь. Спасибо!

1 Ответ

1 голос
/ 10 марта 2020

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 по адресу:

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...