Я пытаюсь отправить уведомление всем пользователям приложения (на Android), по сути дублируя то, что происходит, когда уведомление отправляется через консоль администратора Firebase. Вот команда CURL, с которой я начинаю:
curl --insecure --header "Авторизация: key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Content-Type: application / json" -d "{\" notification \ ": {\" title \ ": \" note -Title \ ", \" body \ ": \" note-Body \ "}}" https://fcm.googleapis.com/fcm/send
Вот этот JSON, разобранный, чтобы вам было удобнее:
{
"notification":{
"title":"note-Title",
"body":"note-Body"
}
}
Ответ, который возвращается, состоит всего из двух символов:
к
Вот оно, слово «к». (Заголовки сообщают о 400). Я подозреваю, что это связано с тем, что в моем JSON не указано «кому». Что вообще поставить на «до»? У меня темы не определены, и устройства ни на что не прописались. Тем не менее, они по-прежнему могут получать уведомления из панели администратора Firebase.
Я хочу попробовать пакет JSON «только данные» из-за удивительного ограничения обработки уведомлений Firebase, при котором, если ваше приложение находится на переднем плане, уведомление обрабатывается ВАШИМ обработчиком, но если ваше приложение находится в фоновом режиме, оно получает обрабатывается ВНУТРЕННЕЕ службой 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. Хорошо ... согласно https://firebase.google.com/docs/cloud-messaging/http-server-ref код 200 с "InvalidRegistration" означает проблему с токеном регистрации. . Может быть? Потому что эта часть документации предназначена для сервера обмена сообщениями. Сервер уведомлений такой же? Не понятно. Я вижу в другом месте, что тема может занять несколько часов, прежде чем она станет активной. Похоже, что это сделало бы его бесполезным для создания новых чатов, так что это тоже кажется неправильным.
Я был очень взволнован, когда смог создать приложение с нуля, которое получало бы уведомления всего за несколько часов, хотя раньше я никогда не использовал Firebase. Похоже, ему предстоит пройти долгий путь, прежде чем он достигнет уровня, скажем, документации Stripe.com.
Итог: кто-нибудь знает, какой JSON предоставить для отправки сообщения на все устройства, на которых запущено приложение, для отражения функций консоли администратора?
FirebaseInstanceIdService
Ответы:
EDIT: похоже, что этот метод больше не поддерживается (спасибо @FernandoZamperin). Пожалуйста, взгляните на другие ответы!
Вместо подписки на тему вы можете вместо этого использовать
condition
ключ и отправлять сообщения экземплярам, которые не входят в группу. Ваши данные могут выглядеть примерно так:{ "data": { "foo": "bar" }, "condition": "!('anytopicyoudontwanttouse' in topics)" }
См. Https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2.
источник
Уведомления Firebase не имеют API для отправки сообщений. К счастью, он построен на основе Firebase Cloud Messaging, у которого есть именно такой API.
С помощью уведомлений Firebase и облачных сообщений вы можете отправлять так называемые нисходящие сообщения на устройства тремя способами:
Вы заметите, что нет возможности явно отправлять на все устройства. Вы можете создать такую функциональность с каждым из них, например: подписав приложение на тему при ее запуске (например
/topics/all
) или сохранив список всех идентификаторов устройств, а затем отправив сообщение всем им.Для отправки в тему у вас есть синтаксическая ошибка в вашей команде. Темы обозначены буквами, начинающимися с
/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!", } }
источник
/topics/
во множественном числеСамый простой способ, который я придумал для отправки 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 Tutorial - Push Notifications using FCM
Чтобы отправить сообщение на комбинацию тем, укажите условие , которое является логическим выражением, определяющим целевые темы. Например, следующее условие отправит сообщения устройствам, на которые подписаны,
TopicA
и либо,TopicB
либоTopicC
:{ "data": { "title": "Your title", "message": "Your message" "image-url": "your_image_url" }, "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)" }
Узнайте больше об условиях и темах здесь, в документации FCM.
источник
Service
которые расширяютсяFirebaseMessagingService
в#onMessageReceived
функции. Таким образом, уведомление не отображается автоматически, вы должны позаботиться об этом самостоятельно.Один из способов сделать это - сделать так, чтобы все устройства ваших пользователей подписывались на тему. Таким образом, когда вы нацеливаете сообщение на определенную тему, все устройства получат его. Думаю, именно так это делает раздел уведомлений в консоли Firebase.
источник
Я искал решение для своего push-уведомления в приложении Ionic Cordova.
Благодаря ответу Сайеда Рафая.
в app.component.ts
const options: PushOptions = { android: { topics: ['all'] },
в файле сервера
"to" => "/topics/all",
источник
Просто заставьте всех пользователей, которые входят в систему, подписаться на определенную тему, а затем отправьте уведомление по этой теме.
источник
Проверьте свой список тем на консоли firebase.
Перейти в консоль firebase
Нажмите Grow из бокового меню
Нажмите Cloud Messaging.
Нажмите Отправить первое сообщение.
В разделе уведомлений, введите что - то для заголовка уведомления и текст уведомления
Нажмите Далее
В целевом разделе нажмите Тема
Нажмите на текстовое поле темы сообщения , после чего вы увидите свои темы (я не создавал тему под названием android или ios, но я вижу эти две темы.
Когда вы отправляете push-уведомление, добавьте это как ваше условие.
"condition" => "'все' в темах || 'android' в темах || 'ios' в темах",
Все тело
array( "notification"=>array( "title"=>"Test", "body"=>"Test Body", ), "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics", );
Если у вас есть другие темы, вы можете добавить их с помощью || (или) условие, тогда все пользователи получат ваше уведомление. Проверял и работал у меня.
источник
Вы можете отправлять уведомления на все устройства, используя "/ 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!", } }
источник