Próbuję wysłać powiadomienie do wszystkich użytkowników aplikacji (na Androida), zasadniczo kopiując to, co się dzieje, gdy powiadomienie jest wysyłane za pośrednictwem konsoli administratora Firebase. Oto polecenie CURL, od którego zaczynam:
curl --insecure --header "Autoryzacja: key = AIzaSyBidmyauthkeyisfineL-6NcJxj-1JUvEM" --header "Content-Type: application / json" -d "{\" notification \ ": {\" title \ ": \" uwaga -Title \ ", \" body \ ": \" note-Body \ "}}" https://fcm.googleapis.com/fcm/send
Oto ten JSON przeanalizowany, aby był mniej męczący dla oczu:
{
"notification":{
"title":"note-Title",
"body":"note-Body"
}
}
Odpowiedź, która wraca, to tylko dwa znaki:
do
To wszystko, słowo „do”. (Nagłówki zgłaszają 400) Podejrzewam, że ma to związek z brakiem „to” w moim JSON. Co w ogóle można by nazwać „do”? Nie mam zdefiniowanych tematów, a urządzenia się nie zarejestrowały. Mimo to nadal mogą otrzymywać powiadomienia z panelu administratora Firebase.
Chcę wypróbować pakiet JSON „tylko do danych” ze względu na niesamowite ograniczenie przetwarzania powiadomień Firebase, w którym jeśli Twoja aplikacja jest na pierwszym planie, powiadomienie jest przetwarzane przez TWOJĄ procedurę obsługi, ale jeśli Twoja aplikacja działa w tle, przetwarzane WEWNĘTRZNIE przez usługę Firebase i nigdy nie przekazywane do modułu obsługi powiadomień. NAJBLIŻSZE można to obejść, wysyłając żądanie powiadomienia przez API, ale TYLKO jeśli robisz to tylko z danymi. (Co z kolei uniemożliwia obsługę iOS i Androida tą samą wiadomością). Zastąpienie „powiadomienia” słowem „dane” w którymkolwiek z moich plików JSON nie przynosi żadnego efektu.
Ok, więc spróbowałem rozwiązania tutaj: Firebase Java Server wysyła powiadomienia push do wszystkich urządzeń, które wydają mi się mówić „Ok, mimo że powiadomienia dla wszystkich są możliwe przez konsolę administracyjną… nie jest to tak naprawdę możliwe przez API. " Obejście polega na tym, aby każdy klient zasubskrybował temat, a następnie wysłał powiadomienie do tego tematu. Więc najpierw kod w onCreate:
FirebaseMessaging.getInstance().subscribeToTopic("allDevices");
następnie nowy JSON, który wysyłam:
{
"notification":{
"title":"note-Title",
"body":"note-Body"
},
"to":"allDevices"
}
Teraz przynajmniej otrzymuję prawdziwą odpowiedź z serwera. Odpowiedź JSON:
{
"multicast_id":463numbersnumbers42000,
"success":0,
"failure":1,
"canonical_ids":0,
"results":
[
{
"error":"InvalidRegistration"
}
]
}
Do tego dołączony jest kod HTTP 200. Ok ... zgodnie z https://firebase.google.com/docs/cloud-messaging/http-server-ref kod 200 z „InvalidRegistration” oznacza problem z tokenem rejestracyjnym . Może? Ponieważ ta część dokumentacji dotyczy serwera wiadomości. Czy serwer powiadomień jest taki sam? Niejasny. Widzę gdzie indziej, że temat może zająć kilka godzin, zanim stanie się aktywny. Wygląda na to, że byłoby to bezużyteczne do tworzenia nowych pokojów rozmów, więc to również wydaje się być wyłączone.
Byłem bardzo podekscytowany, gdy mogłem napisać od podstaw aplikację, która otrzymywała powiadomienia w ciągu zaledwie kilku godzin, podczas gdy nigdy wcześniej nie korzystałem z Firebase. Wygląda na to, że przed osiągnięciem poziomu, powiedzmy, dokumentacji Stripe.com długa droga.
Podsumowując: czy ktoś wie, jaki kod JSON ma dostarczyć, aby wysłać wiadomość do wszystkich urządzeń, na których działa aplikacja, aby odzwierciedlić funkcjonalność konsoli administracyjnej?
FirebaseInstanceIdService
Odpowiedzi:
EDYCJA: Wygląda na to, że ta metoda nie jest już obsługiwana (dzięki @FernandoZamperin). Proszę spojrzeć na inne odpowiedzi!
Zamiast subskrybować temat, możesz zamiast tego użyć
condition
klucza i wysyłać wiadomości do instancji, które nie są w grupie. Twoje dane mogą wyglądać mniej więcej tak:{ "data": { "foo": "bar" }, "condition": "!('anytopicyoudontwanttouse' in topics)" }
Zobacz https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2
źródło
Powiadomienia Firebase nie mają interfejsu API do wysyłania wiadomości. Na szczęście jest zbudowany na bazie Firebase Cloud Messaging, który ma właśnie takie API.
Dzięki powiadomieniom Firebase i usłudze Cloud Messaging możesz wysyłać tak zwane wiadomości przychodzące do urządzeń na trzy sposoby:
Zauważysz, że nie ma możliwości bezpośredniego wysłania do wszystkich urządzeń. Możesz jednak zbudować taką funkcjonalność z każdym z nich, na przykład: subskrybując aplikację do tematu podczas jej uruchamiania (np.
/topics/all
) Lub przechowując listę wszystkich identyfikatorów urządzeń, a następnie wysyłając wiadomość do wszystkich.Przy wysyłaniu do tematu w poleceniu występuje błąd składniowy. Tematy są identyfikowane zaczynając od
/topics/
. Ponieważ nie masz tego w swoim kodzie, serwer interpretujeallDevices
jako identyfikator urządzenia. Ponieważ jest to nieprawidłowy format tokenu rejestracji urządzenia, generuje błąd.Z dokumentacji dotyczącej wysyłania wiadomości do tematów:
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!", } }
źródło
/topics/
jest w liczbie mnogiejNajłatwiejszy sposób, w jaki wymyśliłem wysyłanie powiadomienia push na wszystkie urządzenia, to zasubskrybowanie ich w temacie „wszystkie”, a następnie wysłanie powiadomienia na ten temat. Skopiuj to w swojej głównej aktywności
FirebaseMessaging.getInstance().subscribeToTopic("all");
Teraz wyślij żądanie jako
{ "to":"/topics/all", "data": { "title":"Your title", "message":"Your message" "image-url":"your_image_url" } }
Może to być nieefektywny lub niestandardowy sposób, ale jak wspomniałem powyżej jest najłatwiejszy. Napisz, jeśli masz lepszy sposób na wysłanie powiadomienia push do wszystkich urządzeń.
Możesz skorzystać z tego samouczka, jeśli nie masz doświadczenia w wysyłaniu powiadomień push za pomocą Firebase Cloud Messaging Samouczek - powiadomienia push przy użyciu FCM
Aby wysłać wiadomość do kombinacji tematów, określ warunek , który jest wyrażeniem logicznym określającym tematy docelowe. Na przykład następujący warunek spowoduje wysłanie wiadomości do urządzeń, które są subskrybowane
TopicA
i alboTopicB
alboTopicC
:{ "data": { "title": "Your title", "message": "Your message" "image-url": "your_image_url" }, "condition": "'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)" }
Przeczytaj więcej o warunkach i tematach tutaj w dokumentacji FCM
źródło
Service
rozszerzeniuFirebaseMessagingService
w#onMessageReceived
funkcji. Aby powiadomienie nie wyświetlało się automatycznie, musisz zająć się nim samodzielnie.Jednym ze sposobów jest zasubskrybowanie tematu na wszystkich urządzeniach użytkowników. W ten sposób, gdy skierujesz wiadomość na określony temat, wszystkie urządzenia ją otrzymają. Myślę, że tak robi to sekcja Powiadomienia w konsoli Firebase.
źródło
Szukałem rozwiązania dla powiadomień push w mojej aplikacji Ionic Cordova.
Dzięki odpowiedzi Syed Rafay.
w app.component.ts
const options: PushOptions = { android: { topics: ['all'] },
w pliku serwera
"to" => "/topics/all",
źródło
Po prostu zmuś wszystkich użytkowników, którzy się logują, do subskrybowania określonego tematu, a następnie wyślij powiadomienie do tego tematu.
źródło
Sprawdź listę tematów w konsoli Firebase.
Przejdź do konsoli Firebase
Kliknij Rozwijaj z menu bocznego
Kliknij opcję Komunikacja w chmurze
Kliknij Wyślij pierwszą wiadomość
W sekcji powiadomień wpisz tytuł powiadomienia i tekst powiadomienia
Kliknij Dalej
W sekcji docelowej kliknij Temat
Kliknij pole tekstowe tematu wiadomości , a następnie możesz zobaczyć swoje tematy (nie utworzyłem tematu o nazwie android lub ios, ale widzę te dwa tematy.
Podczas wysyłania powiadomienia push dodaj to jako swój stan.
"stan" => "'wszystko' w tematach || 'android' w tematach || 'ios' w tematach",
Całe ciało
array( "notification"=>array( "title"=>"Test", "body"=>"Test Body", ), "condition"=> "'all' in topics || 'android' in topics || 'ios' in topics", );
Jeśli masz więcej tematów, możesz dodać je z || (lub) warunek, wtedy wszyscy użytkownicy otrzymają Twoje powiadomienie. Przetestował i działał dla mnie.
źródło
Możesz wysłać powiadomienie na wszystkie urządzenia za pomocą „/ 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!", } }
źródło