Подтвердить что ты не робот

Как отправить уведомление 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 может отправить, чтобы отправить сообщение на все устройства, запускающие приложение, чтобы отразить функциональность консоли администратора?

4b9b3361

Ответ 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

Ответ 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!",
   }
}