Як ви надсилаєте сповіщення Firebase на всі пристрої через CURL?


84

Я намагаюся надіслати сповіщення всім користувачам додатків (на Android), по суті дублюючи те, що відбувається, коли сповіщення надсилається через консоль адміністратора Firebase. Ось команда CURL, з якої я починаю:

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


Перевірте, чи правильно використовуєте ваш маркер api. Спробуйте також надіслати повідомлення GCM на один пристрій і перевірити, чи це працює. Ви можете отримати InstanceId, запустивши програму під час налагодження та встановивши точку зупинкиFirebaseInstanceIdService
Джастін Слейд

Я не бачу, щоб "токен API" відображався під час швидкого пошуку Google у firebase.google.com/docs. Ви маєте на увазі "маркер посвідчення особи"? або "маркер авторизації"? Або ви говорите про мій ключ авторизації, наданий у заголовку? Це один є добре: якщо я можу змінити його від того, що він є, відповідь сервера перемикається на «несанкціонований» замість повідомлення про помилку даний час я отримую.
Anders8,

Здається, цей блог стосується надсилання повідомлення на певний пристрій, а не, як оригінальна дискусія, щодо надсилання його лише всім користувачам програми.
Anders8,

Прочитайте цей допис у блозі, щоб дізнатись більше -> developine.com/…
Developine

Відповіді:


56

РЕДАКТУВАТИ: Здається, цей метод більше не підтримується (через @FernandoZamperin). Погляньте, будь ласка, на інші відповіді!

Замість того, щоб підписатися на тему, ви можете замість цього використовувати conditionключ і надсилати повідомлення екземплярам, ​​які не входять до групи. Ваші дані можуть виглядати приблизно так:

{
    "data": {
        "foo": "bar"
    },
    "condition": "!('anytopicyoudontwanttouse' in topics)"
}

Див. Https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2


3
це найкраща відповідь. Її можна запустити негайно, не потребуючи оновлення програми. чудово!
Том

нарешті виявив, що це - вони дійсно повинні зробити це більш очевидним, щоб використовувати це
cwiesner

Це виглядає багатообіцяючим, але чи справді це працює? Це схоже на хак. Я спробував це на зразковому проекті, і він працює. Однак я не впевнений, чи буде це працювати з моїм додатком-продюсером, який має тисячі активних користувачів. Хто-небудь пробував це за допомогою програми-виробника?
Сахіл Патель,

4
Я використовував цей підхід досить давно і працював чудово, сьогодні чомусь відправляю повідомлення на застарілий api, він повертає мені message_id без помилок, але пристрої не отримують push-повідомлень, будь-які здогадки проблема? Перевірено відправлення на один маркер, і він працював нормально.
Фернандо Замперін

1
@VitVeres Я надіслав запит до команди підтримки Firebase, і вони відповіли мені так: "Ваше поточне використання виразів для розсилки push-сповіщень не підтримується. Переконайтесь, що теми, перелічені у виразі, існують для вашого проекту програми.", Тому я думаю, мені доведеться впроваджувати теми у свої програми.
Фернандо Замперін

98

Повідомлення Firebase не мають API для надсилання повідомлень. На щастя, він побудований поверх Firebase Cloud Messaging, який має саме такий API.

За допомогою сповіщень Firebase та хмарних повідомлень ви можете надсилати так звані повідомлення на пристрої трьома способами:

  1. на певні пристрої , якщо ви знаєте їх ідентифікатори
  2. до груп пристроїв , якщо вам відомі реєстраційні ідентифікатори груп
  3. до тем , які є лише клавішами, на які пристрої можуть передплатити

Ви зауважите, що неможливо надіслати на всі пристрої явно. Ви можете створити таку функціональність із кожним із них, наприклад: підписавши програму на тему при її запуску (наприклад /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!",
   }
}

Я спробував надіслати {"to": "/ topic / allDevices", "data": {"message": "Це повідомлення теми хмарних повідомлень Firebase!"}} І отримав ту саму відповідь InvalidRegistration. Я вважаю, що це означає, що тема не є дійсною. Я не бачу в консолі можливості поглянути на базу даних тем.
Anders8,

7
/topics/є множиною
Frank van Puffelen

посмішка О, помилка, помилка програміста. ;) Нова відповідь: {"message_id": 5115052numbers95180}, що, безумовно, виглядає набагато успішнішим. Отже, схоже на суть: хоча на консолі адміністратора є функціональність живлення для доставки сповіщень за допомогою «Сповіщення», жодного способу це не викликає з подань API, і слід просто перетворити себе на використання повідомлень. (Втрачаючи вбудоване в Сповіщення планування та відстеження конверсій) Я шукатиму код обміну повідомленнями для обробки отримання. Дякую Френку. :)
Anders8

1
Е-е ... не дуже. Консоль сповіщень просто надсилає повідомлення повідомлень (див. Цю документацію про типи повідомлень ). Єдине, для чого у нас ще немає API, - це надсилання аудиторії .
Frank van Puffelen

1
це те саме для iOS теж? Я спробував те саме, і отримую сповіщення, коли додаток живий, але у фоновому режимі це не працює
vinbhai4u

72

Найпростіший спосіб розіслати 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


Щоб надіслати повідомлення до комбінації тем, вкажіть умову , яка є логічним виразом, що визначає цільові теми. Наприклад, наступна умова надсилатиме повідомлення на пристрої, на які підписані 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


Для мене це має сенс. Але, як і ви, я не впевнений, що це неефективно. Будь ласка, може хтось це пояснить?
JCarlosR,

2
Я не думаю, що це неефективно, це може бути єдиним можливим способом надсилати push-сповіщення на всі пристрої (я не міг знайти жодного іншого способу принаймні)
Сайед Рафай,

1
Краща відповідь! :)
wonsuc

2
Чудова відповідь. Оскільки це ніде не згадувалося, важливо знати, що ви отримаєте такий тип повідомлень у своєму, Serviceщо розширюється FirebaseMessagingServiceу #onMessageReceivedфункції. Таким чином, сповіщення не відображається автоматично, вам доведеться подбати про нього самостійно.
Reverse

4

Один із способів зробити це - зробити так, щоб усі пристрої ваших користувачів підписалися на тему. Таким чином, коли ви націлите повідомлення на певну тему, його отримають усі пристрої. Я думаю, що це робиться в розділі Сповіщення на консолі Firebase.


Прочитайте цей допис у блозі, щоб дізнатись більше -> developine.com/…
Developine

2

Я шукав рішення для свого push-повідомлення про додаток Ionic Cordova.

Завдяки відповіді Сайеда Рафая.

у app.component.ts

const options: PushOptions = {
  android: {
    topics: ['all']
  },

у файлі сервера

"to" => "/topics/all",

1

Просто змусіть усіх користувачів, які увійшли в систему, підписатися на певну тему, а потім надіслати повідомлення на цю тему.


0

Перевірте свій список тем на консолі Firebase.

  1. Перейдіть на консоль Firebase

  2. Натисніть Зростити з бічного меню

  3. Клацніть Cloud Messaging

  4. Клацніть Надіслати своє перше повідомлення

  5. У розділі сповіщення введіть щось для заголовка сповіщення та сповіщення тексту сповіщення

  6. Клацніть Далі

  7. У цільовому розділі натисніть Тема

  8. Натисніть на текстовому полі теми повідомлення , тоді ви зможете побачити свої теми (я не створював тему під назвою android або ios, але я бачу ці дві теми.

  9. Коли ви надсилаєте push-повідомлення, додайте це як свою умову.

    "condition" => "'все' у темах || 'android' у темах || 'ios' у темах",

Повне тіло

array(
    "notification"=>array(
        "title"=>"Test",
        "body"=>"Test Body",
    ),
    "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics",
);

Якщо у вас більше тем, ви можете додати теми з || (або) умови, тоді всі користувачі отримають ваше сповіщення. Перевіряв і працював у мене.


-4

Ви можете надсилати сповіщення на всі пристрої за допомогою "/ topics / 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!",
   }
}

Це нова функціональність? Або для цього потрібно, щоб програма підписалася на "все"?
Anders8,

Це функціональність за замовчуванням. Я не підписуюсь на жодну тему. Це працює для мене. Але я зробив реєстрацію символів. "getToken"
Шива Каруппія,

1
Ви отримаєте ідентифікатор повідомлення, так, але ні на який пристрій нічого не надсилається, якщо у вас немає теми з назвою "все".
Абдалрахман Шату

Ні. Я отримав повідомлення на своїх пристроях Android (два). ти хочеш, щоб я прикріпив свій знімок екрану? Я будую свій додаток поверх йонку.
Siva Karuppiah

Це працює для мене. Не знаю, чому це проти.
m1crdy 03.03.17

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.