Как вы отправляете уведомление Firebase на все устройства через CURL?

Я пытаюсь отправить уведомление всем пользователям приложения (на Android), по сути дублируя то, что происходит, когда уведомление отправляется через консоль администратора Firebase. Вот команда CURL, с которой я начинаю:

curl --insecure --header "Авторизация: key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Тип содержимого: application / json" -d "{\" messages \ ": {\" title \ ": \" note -title \ "\ "тело \": \ "записная тела \"}}"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 предоставить, чтобы отправить сообщение на все устройства, на которых запущено приложение, чтобы отразить функциональность консоли администратора?

 Anders801 июл. 2017 г., 13:12
Похоже, что этот блог посвящен отправке сообщения на определенное устройство, а не, как в первоначальном обсуждении, рассылке его всем пользователям приложения.
 Hammad Tariq11 нояб. 2017 г., 16:40
Прочтите этот пост для более подробной информации ->developine.com/...
 Justin Slade07 июл. 2016 г., 06:36
Проверьте, правильно ли используется ваш API-токен. Также попробуйте отправить сообщение GCM одному устройству и посмотреть, работает ли оно. Вы можете получить InstanceId, запустив приложение в режиме отладки и установив точку останова наFirebaseInstanceIdService
 Anders807 июл. 2016 г., 06:48
Я не вижу "api token" в быстром поиске Google firebase.google.com/docs. Вы имеете в виду "идентификационный токен"? или "Токен аутентификации"? Или вы говорите о моем ключе авторизации, указанном в шапке? Вон тотявляется хорошо: если я изменю его на то, что он есть, ответ сервера переключится на «неавторизованный» вместо сообщения об ошибке, которое я получаю в настоящее время.

Ответы на вопрос(6)

/ 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!",
   }
}
 Abdalrahman Shatou25 февр. 2017 г., 11:12
Да, вы получите сообщение с идентификатором сообщения, но на любое устройство ничего не отправляется, если у вас нет темы с именем «all»
 hablema30 мар. 2017 г., 08:11
Это не сработало для меня. Нет ошибок Получил идентификатор сообщения в ответ, но толчок не доставляется.
 Anders818 февр. 2017 г., 10:26
Это новый функционал? Или это требует, чтобы приложение подписывалось на «все»?
 Siva Karuppiah27 февр. 2017 г., 07:05
Нет, я получил уведомление в моих устройствах Android (два). Вы хотите, чтобы я прикрепил свой снимок экрана? Я строю свое приложение поверх ioinc.
 m1crdy03 мар. 2017 г., 09:46
Это работает для меня. Не знаю, почему за это проголосовали.
 Raj18 апр. 2019 г., 18:59
вам нужно подписаться на тему "все" FirebaseMessaging.getInstance (). subscribeToTopic ("crichop")
 Siva Karuppiah20 февр. 2017 г., 13:34
Это функциональность по умолчанию. Я не подписываюсь ни на одну тему. Это работает для меня. Но я сделал регистрацию токенов. "GetToken"
 user285873813 дек. 2017 г., 18:57
Firebase не проверяет, существует ли тема. Он просто отправляет уведомление по темам. Пока вы не создадите тему с именем «all» и не подпишете на нее пользователя, никто не получит уведомление.
 Richard Le Mesurier22 февр. 2017 г., 16:47
Это не работает, насколько я могу судить
 Evren Ozturk20 мар. 2017 г., 08:31
Это не работает ... Вы получаете идентификатор сообщения с любым ключевым словом. Но нет темы с названием «все», поэтому ни одно устройство не получает сообщение.

телей подписаться на тему. Таким образом, когда вы нацеливаете сообщение на определенную тему, все устройства получат его. Я думаю, что так делает раздел «Уведомления» в консоли Firebase.

 Hammad Tariq11 нояб. 2017 г., 16:40
Прочтите этот пост для более подробной информации ->developine.com/...

писать их на тему «все», а затем отправить уведомление в эту тему. Скопируйте это в свою основную деятельность

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

 wonsuc27 мая 2018 г., 21:28
Лучший ответ! :)
 reVerse02 сент. 2018 г., 18:22
Отличный ответ. Поскольку это нигде не упоминалось, важно знать, что вы будете получать такого рода сообщения в своемService это расширяетсяFirebaseMessagingService в#onMessageReceived функция. Таким образом, уведомление не отображается автоматически, вы должны позаботиться о нем самостоятельно.
 Syed Rafay17 февр. 2018 г., 13:19
Я не думаю, что это неэффективно, это может быть единственный возможный способ отправить push-уведомление на все устройства (я не мог найти другой способ по крайней мере)
 JCarlos08 февр. 2018 г., 02:50
Это имеет смысл для меня. Но, как и вы, я не уверен, что это неэффективно. Пожалуйста, кто-нибудь может это уточнить?

которые входят в систему, подписаться на определенную тему, а затем отправить уведомление на эту тему.

но вы должны перейти на панель Firebase и изменили

Аноним >>>>> Включено

введите описание изображения здесь

Решение Вопроса

он построен на основе Firebase Cloud Messaging, который имеет именно такой API.

С помощью Firebase Notifications и Cloud Messaging вы можете отправлять так называемые нисходящие сообщения на устройства тремя способами:

для конкретных устройств, если вы знаете их идентификаторы устройствгруппам устройств, если вы знаете регистрационные идентификаторы группк темам, которые являются просто ключами, на которые устройства могут подписаться

Вы заметите, что нет возможности явной отправки на все устройства. Вы можете создать такую ​​функциональность с каждым из них, хотя.

Для отправки в тему у вас есть синтаксическая ошибка в вашей команде. Темы определяются, начиная с/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!",
   }
}
 Ajay Sharma04 июл. 2017 г., 12:37
@FrankvanPuffelen Что делать, если я хочу отправить уведомление из Device1 на Device2 из приложения?
 Frank van Puffelen04 июл. 2017 г., 16:59
Посмотрите мой пост здесь, чтобы узнать, как отправлять уведомления между устройствами:firebase.googleblog.com/2016/08/...
 Florescu Cătălin27 апр. 2017 г., 10:31
Уже 4 дня пытаюсь отправить уведомления с андроида по темам. Единственное, что я пропустил, было/topics/, Спасибо!
 Frank van Puffelen07 июл. 2016 г., 21:09
/topics/ множественное число
 Kenji01 янв. 2017 г., 15:14
как можно переадресовать сообщение?
 AymanKun04 дек. 2016 г., 18:44
Есть ли способ отправить хедз-ап уведомления таким же образом?
 Hammad Tariq11 нояб. 2017 г., 16:40
Прочтите этот пост для более подробной информации ->developine.com/...
 Amjad Omari29 мар. 2017 г., 13:11
есть ли квота на отправку уведомления? если да, что это?
 Anders807 июл. 2016 г., 20:21
Я попытался отправить {"to": "/ topic / allDevices", "data": {"message": "Это сообщение темы Firebase Cloud Messaging!"}} И получил такой же ответ InvalidRegistration. Я бы предположил, что это означает, что тема не является действительной. Я не вижу в консоли способа просмотреть базу данных тем.
 Frank van Puffelen07 июл. 2016 г., 23:11
Хм ... не совсем. Консоль уведомлений просто отправляет уведомления (см.это документация о типах сообщений). Единственное что мы делаемпока не имеет API для отправки аудитории.
 vinbhai4u12 авг. 2016 г., 09:22
это то же самое для iOS тоже? Я попробовал то же самое, и я получаю уведомление, когда приложение живо, но в фоновом режиме оно не работает
 Anders807 июл. 2016 г., 21:51
ухмылка О, опечатка, проклятие программиста. ;) Новый ответ: {"message_id": 5115052numbers95180}, что, безусловно, выглядит намного успешнее. Таким образом, звучит так, что суть заключается в том, что хотя в консоли администратора имеется мощная функциональность для доставки уведомлений через «Уведомления», НЕТ никакого способа инициировать это из представлений API, и нужно просто преобразовать себя в использование сообщений. (Потеря расписания и отслеживания конверсий, встроенных в уведомления). Я поищу код сообщения для обработки получения. Спасибо, Фрэнк. :)

Ваш ответ на вопрос