Как отправить уведомление Firebase на все устройства через CURL?
Я пытаюсь отправить уведомление всем пользователям приложений (на Android), по существу дублируя то, что происходит, когда уведомление отправляется через консоль администратора Firebase. Вот команда CURL, с которой я начинаю:
curl --insecure --header "Авторизация: key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" - header "Content-Type: application/json" -d "{\" уведомление \ ": {\" title\ ":\" note-Title \ ",\" body \ ":\" note-Body \ "}}" https://fcm.googleapis.com/fcm/send
Здесь JSON разбирался, чтобы быть проще на ваших глазах:
{
"notification":{
"title":"note-Title",
"body":"note-Body"
}
}
Ответ, который возвращается, состоит всего из двух символов:
к
Что это, слово "to". (Заголовки сообщают о 400) Я подозреваю, что это связано с тем, что у меня нет "на" в моем JSON. Что бы кто-то даже поставил для "к"? У меня нет определенных тем, и устройства не зарегистрировались ни за что. Тем не менее, они все еще могут получать уведомления с панели администратора Firebase.
Я хочу попробовать пакет JSON "только данные" из-за удивительного ограничения обработки уведомлений Firebase, в котором, если ваше приложение находится на переднем плане, уведомление обрабатывается вашим обработчиком, но если ваше приложение находится в фоновом режиме, он обрабатывается INTERNATIONAL службой Firebase и никогда не переходит к вашему обработчику уведомлений. ПРИМЕРНО это можно обойти, если вы отправляете запрос на уведомление через API, но ТОЛЬКО, если вы делаете это только с данными. (Что затем нарушает способность обрабатывать iOS и Android с тем же сообщением.) Замена "уведомления" на "данные" в любом из моих JSON не влияет.
Хорошо, тогда я попытался найти решение здесь: Firebase Java Server для отправки push-уведомлений обо всех устройствах
который, как мне кажется, говорит "Хорошо, хотя уведомления всем доступны через консоль администратора... это не реально возможно через API". Обходной путь заключается в том, чтобы каждый клиент подписался на тему, а затем вытолкнул уведомление на эту тему. Итак, сначала код в onCreate:
FirebaseMessaging.getInstance().subscribeToTopic("allDevices");
то новый JSON я отправляю:
{
"notification":{
"title":"note-Title",
"body":"note-Body"
},
"to":"allDevices"
}
Итак, теперь я получаю реальный ответ от сервера по крайней мере. Ответ JSON:
{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
[
{
"error":"InvalidRegistration"
}
]
}
И это поставляется с HTTP-кодом 200. Ok... согласно https://firebase.google.com/docs/cloud-messaging/http-server-ref код 200 с "InvalidRegistration" означает проблему с регистрационным токеном. Может быть? Поскольку эта часть документации предназначена для сервера обмена сообщениями. Является ли сервер уведомлений одинаковым? Не понятно. Я вижу в другом месте, что эта тема может занять несколько часов до ее активного участия. Похоже, что это создало бы бесполезность для создания новых чатов, так что это тоже кажется.
Я был очень взволнован, когда смог записать приложение с нуля, которое получало уведомления всего за несколько часов, когда я раньше не использовал Firebase. Похоже, что ему предстоит пройти долгий путь, прежде чем он достигнет уровня, скажем, документации Stripe.com.
В нижней части: кто-нибудь знает, что JSON может отправить, чтобы отправить сообщение на все устройства, запускающие приложение, чтобы отразить функциональность консоли администратора?
Ответы
Ответ 1
Уведомления Firebase не имеют API для отправки сообщений. К счастью, он построен поверх Firebase Cloud Messaging, который имеет именно такой API.
С уведомлениями Firebase и облачными сообщениями вы можете отправлять так называемые нисходящие сообщения на устройства тремя способами:
Вы заметите, что нет возможности отправлять сообщения на все устройства явно. Вы можете создать такую функциональность с каждым из них, хотя.
Для отправки в тему у вас есть синтаксическая ошибка в вашей команде. Темы определяются с помощью /topics/
. Поскольку у вас этого нет в коде, сервер интерпретирует allDevices
как идентификатор устройства. Так как это недопустимый формат для токена регистрации устройства, он вызывает ошибку.
Из документации по отправке сообщений на темы:
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
"to": "/topics/foo-bar",
"data": {
"message": "This is a Firebase Cloud Messaging Topic Message!",
}
}
Ответ 2
Самый простой способ отправить push-уведомление всем устройствам - подписать их на тему "все", а затем отправить уведомление в эту тему. Скопируйте это в свою основную деятельность
FirebaseMessaging.getInstance().subscribeToTopic("all");
Теперь отправьте запрос как
{
"to":"/topics/all",
"data":
{
"title":"Your title",
"message":"Your message"
"image-url":"your_image_url"
}
}
Это может быть неэффективным или нестандартным способом, но, как я уже говорил выше, это проще всего. Пожалуйста, пишите, если у вас есть какой-нибудь лучший способ отправить push-уведомление на все устройства.
Вы можете следовать этому руководству, если вы новичок в отправке push-уведомлений с помощью Учебника по Firebase Cloud Messaging - Push-уведомления с использованием FCM
Ответ 3
Один из способов сделать это - подключить все устройства ваших пользователей к теме. Таким образом, когда вы нацеливаете сообщение на определенную тему, все устройства получат его. Я думаю, что это делает раздел уведомлений в консоли Firebase.
Ответ 4
Просто заставьте всех пользователей, которые входят в систему, подписаться на определенную тему, а затем отправить уведомление на эту тему.
Ответ 5
Я искал решение для push-уведомления моего приложения Ionic Cordova.
Спасибо Сайеду Рафаю за ответ.
в app.component.ts
const options: PushOptions = {
android: {
topics: ['all']
},
в файле сервера
"to" => "/topics/all",
Ответ 6
Вместо того, чтобы подписываться на тему, вы можете использовать клавишу condition
и отправлять сообщения экземплярам, которые не входят в группу. Ваши данные могут выглядеть примерно так:
{
"data": {
"foo": "bar"
},
"condition": "!('anytopicyoudontwanttouse' in topics)"
}
См https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2
Ответ 7
Вы можете использовать /themes/all, но вы должны перейти на панель Firebase и изменили
Аноним >>>>> Включено
введите описание изображения здесь
Ответ 8
Вы можете отправлять уведомления обо всех устройствах с помощью "/themes/all"
https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA
{
"to": "/topics/all",
"notification":{ "title":"Notification title", "body":"Notification body", "sound":"default", "click_action":"FCM_PLUGIN_ACTIVITY", "icon":"fcm_push_icon" },
"data": {
"message": "This is a Firebase Cloud Messaging Topic Message!",
}
}