Повторно отправляем этот вопрос, потому что мы добились значительного прогресса, но еще не совсем разобрались. Я использую эту библиотеку и успешно работаю с 2021 года в своем приложении для Android.
com.microsoft.azure:notification-hubs-android-sdk-fcm:1.1.4
RegisterTemplate прекрасно создает GcmTemplateRegistrationDescription и GcmRegistrationId.
Необходимо создать FcmV1TemplateRegistration и FcmV1RegistrationId, чтобы обновить их до версии 2.0.0.
com.microsoft.azure:notification-hubs-android-sdk:2.0.0
Вызов регистрации шаблона на устройстве теперь создает FcmV1TemplateRegistration в Azure Hub.
(Сначала зарегистрируйте устройство Android с помощью функции FirebaseMessaging.getInstance().getToken())
String messageTemplate = "{\"message\":{\"android\":{\"data\":{\"msgtext\":\"$(msgtext)\",\"msgsndr\":\"$(msgsndr)\"}}}}";
String RegistrationTagTopic = "5050";
mobile_RegistrationId = hub.registerTemplate(regid, "CAREV1", messageTemplate, RegistrationTagTopic).getRegistrationId();
Пример регистрации: возвращенный выше mobile_RegistrationId — это RegistrationId Notification Hub.
<ETag>5</ETag>
<ExpirationTime>2124-06-12T05:55:24.1941413Z</ExpirationTime>
<RegistrationId>2837404...516-2</RegistrationId>
<Tags>5050</Tags>
<FcmV1RegistrationId>eZMPxd2pQBi...Uh</FcmV1RegistrationId>
<BodyTemplate><![CDATA[{"message":{"android":{"data":{"msgtext":"$(msgtext)","msgsndr":"$(msgsndr)"}}}}]]></BodyTemplate>
<TemplateName>CAREV1</TemplateName>
</FcmV1TemplateRegistrationDescription>
Кажется, формат шаблона в приложении для FCMv1 абсолютно важен, потому что мое приложение выдало исключение при регистрации в любом другом формате, кроме {"message":{"android":{"data":{...}}} }
Отправьте тег устройства 5050 с помощью метода REST API Azure Notification Hubs, того же вызова API, который мы успешно использовали с 2015 года (предположим, вы знаете, как создать токен авторизации): отправьте шаблонное уведомление с такими параметрами, как;
ServiceBusNotification-Format = "template"
ServiceBusNotification-Tags = "5050"
ContentType = "application/json;charset=utf-8."
Method = "POST"
URI = "https://{namespace}.servicebus.windows.net/{NotificationHub}/messages/?api-version=2015-01"
Пример JSON, опубликованного в вызове
{"message":{"android":{"data":{"msgtext":"My short message","msgsndr":"ADMIN"}}}}
Оказывается, это просто неправильно на стороне сервера (см. ниже). Уведомление получено на устройстве, но полезная нагрузка отсутствует
Зарегистрировано с использованием режима &test с REST API, все выглядело так, как будто все работает, Reg Id и PnsHandle совпадают и распознают fcmV1Template, но это не так..!
address : 5050
Success : 1
Failure : 0
Appform : fcmV1Template
Reg Id : 2837404...516-2
PnsHandle : eZMPxd2pQBi...Uh
Outcome : The Notification was successfully sent to the Push Notification System
Отправьте (POST) то же сообщение напрямую на номер 5050 через процедуру FCM/JWT, немного другой формат JSON;
{"message":{"topic":"5050","data":{"msgtext":"My short message","msgsndr":"ADMIN"},"android":{"priority":"high"},"fcm_options":{"analytics_label":"xyz"}}}
Полезная нагрузка уведомлений и сообщений идеальна (обратите внимание на дополнительные параметры FCM) и работает всегда. Конечно, FCM не требует шаблона в самом приложении или серверном процессе.
Вопрос: Что не так с отправкой моего шаблона через Центры уведомлений?
РЕШЕНО 18 ИЮНЯ 2024 ГОДА 17:12 NZST
Кажется, мне вообще не нужно было изменять структуру JSON метода REST API Azure Notification Hubs.
Центры уведомлений выяснили, что одно приложение устройства — это FcmV1TemplateRegistration с fcmV1Template, а другое — GcmTemplateRegistration с gcmTemplate, поскольку приложение еще не обновилось. JSON, отправленный нашим сервером, напоминает только ветвь Data: в шаблоне JSON, зарегистрированном приложением Android в Центрах уведомлений.
Вот мой журнал с использованием исходной структуры JSON с включенным параметром &test;
Post URI https://mrblobby.servicebus.windows.net/free/messages/?api-version=2015-01&test
ContentType application/json;charset=utf-8.
{"msgaddr":"65552","msgsndr":"ADMIN","msgtext":"Re-Test with original server"}
call webrequest
Response WebRequest StatusCode: 201
Response WebRequest StatusDescription: Created
WebRequest succeeded with status code: 201 Description: Created
address : 65552
Success : 1
Failure : 0
Appform : gcmTemplate
Reg Id : 7873109321995......789764826990-2
PnsHandle : dZJC0CJ6QOea_y7Gr......jCx_TTaPfOlYlo3NIrQ9rmbOHaUg2aRoTDW0rCrFOAy4Gk1
Outcome : The Notification was successfully sent to the Push Notification System
ContentType application/json;charset=utf-8.
{"msgaddr":"5050","msgsndr":"ADMIN","msgtext":"Re-Test with original server"}
call webrequest
Response WebRequest StatusCode: 201
Response WebRequest StatusDescription: Created
WebRequest succeeded with status code: 201 Description: Created
address : 5050
Success : 1
Failure : 0
Appform : fcmV1Template
Reg Id : 2837404753035......116714665516-2
PnsHandle : eZMPxd2pQBic3hfuF......fNXW4qT5-UhCFM1W3ZDL1XZw7oiLaTDJk1v7tqnw-xEe2i
Outcome : The Notification was successfully sent to the Push Notification System
Наслаждаться
Попробуйте изменить полезную нагрузку туда, где data находится за пределами поля android. Любые переменные, которые вы хотите отправить на телефон для обработки, должны находиться внутри поля data. Я бы тоже сбросила fcm_options. Наша полезная нагрузка структурирована следующим образом:
{
"message": {
"android":{
"priority":"high"
},
"data": {
“message”:””,
“title”:””,
“datafield”:””,
}
}
}
«Поддержка устаревшего API Firebase Cloud Messaging для Центров уведомлений Azure будет прекращена к 20 июня 2024 г.»
Если вы получаете эти электронные письма, вот что вам нужно сделать в приложении для Android:
implementation 'com.microsoft.azure:notification-hubs-android-sdk:2.0.0'
Обновите шаблон в своем приложении для вызова RegisterTemplate.
String messageTemplate =
"{\"message\":{\"android\":{\"data\":
{\"yourtext\":\"$(yourtext)\",\"msgsndr\":\"$(msgsndr)\"}}}}";
Обязательно придерживайтесь общей структуры JSON, указанной выше, иначе ваше приложение выйдет из строя при регистрации.
Внутри данных: скобка имеет произвольную форму, но просто используйте те же поля из существующего шаблона, а затем...
Если вы используете метод REST API Центров уведомлений Azure, никаких изменений в серверном процессе не требуется, при условии, что вы ничего не меняли в полезных данных JSON.
SDK автоматически регистрирует устройства как FCMv1, а Центр уведомлений использует соответствующий FcmV1TemplateRegistrationDescription.
Учетные данные уже должны быть настроены в Hub for Google (FCM v1). Получите значения из файла xxx-hub-firebase-adminsdk-xxxx-xxxxxxx.json, и все готово...
Надеюсь, для вас еще не поздно, я только час назад загрузил обновленное приложение в Google Play. Удачи..!
Спасибо @Zachary Bell, я попробую. Просто чтобы уточнить... вы отправляете с помощью REST API Центров уведомлений? Ваша структура JSON такая же, как мы используем с процедурой FCM/JWT, которая работает отлично и не учитывает какой-либо шаблон, зарегистрированный приложением в ANH.