CURL을 통해 모든 기기에 Firebase 알림을 어떻게 보내나요?


84

기본적으로 Firebase 관리 콘솔을 통해 알림을 보낼 때 발생하는 상황을 복제하여 모든 앱 사용자 (Android)에게 알림을 보내려고합니다. 시작하는 CURL 명령은 다음과 같습니다.

curl --insecure --header "Authorization : 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"
    }
}

반환되는 응답은 두 문자입니다.

...에

그게 바로 "to"라는 단어입니다. (Headers는 400을보고합니다.) JSON에 "to"가없는 것과 관련이 있다고 생각합니다. "to"에 무엇을 넣을까요? 정의 된 주제가 없으며 장치가 아무것도 등록하지 않았습니다. 하지만 여전히 Firebase 관리자 패널에서 알림을받을 수 있습니다.

Firebase 알림 처리의 놀라운 제한으로 인해 "데이터 전용"JSON 패키지를 시도하고 싶습니다. 앱이 포 그라운드에 있으면 알림이 핸들러에 의해 처리되지만 앱이 백그라운드에 있으면 Firebase 서비스에서 내부적으로 처리되며 알림 핸들러로 전달되지 않습니다. API를 통해 알림 요청을 제출하면이 문제를 해결할 수 있지만 데이터 전용으로 수행하는 경우에만 가능합니다. (그러면 동일한 메시지로 iOS 및 Android를 처리하는 기능이 중단됩니다.) JSON에서 "notification"을 "data"로 바꾸는 것은 효과가 없습니다.

좋아, 그런 다음 해결책을 시도했습니다. Firebase Java Server가 모든 기기에 푸시 알림을 보내는 것으로 보이며 "Ok, 관리 콘솔을 통해 모든 사람에게 알림이 가능하지만 ... 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 에 따르면 "InvalidRegistration"이있는 200 코드는 등록 토큰에 문제가 있음을 의미합니다. . 아마도? 설명서의 해당 부분은 메시징 서버에 대한 것입니다. 알림 서버가 동일합니까? 명확하지 않습니다. 주제가 활성화되기까지 몇 시간이 걸릴 수 있다는 것을 다른 곳에서 봅니다. 그것은 새로운 대화방을 만드는 데 쓸모가 없을 것 같아서 그것도 꺼져 보입니다.

이전에 Firebase를 사용하지 않았던 몇 시간 만에 알림을받는 앱을 처음부터 코딩 할 수 있다는 사실에 매우 흥분했습니다. Stripe.com 문서 수준에 도달하기까지는 갈 길이 멀어 보입니다.

결론 : 관리 콘솔 기능을 미러링하기 위해 앱을 실행하는 모든 기기에 메시지를 보내기 위해 제공해야 할 JSON을 아는 사람이 있습니까?


사용중인 API 토큰이 올바른지 확인하십시오. 또한 GCM 메시지를 단일 장치로 보내고 작동하는지 확인하십시오. 디버그 응용 프로그램을 시작하고 중단 점을 넣어으로 당신은 InstanceID에를 얻을 수 있습니다FirebaseInstanceIdService
저스틴 슬레이드

firebase.google.com/docs의 빠른 Google 검색에 "api 토큰"이 표시되지 않습니다. "ID 토큰"을 의미합니까? 또는 "인증 토큰"? 아니면 헤더에 제공된 내 인증 키에 대해 이야기하고 있습니까? 하나 그 입니다 벌금 : 나는 그것이 무엇에서 그것을 변경하는 경우, 서버 응답 대신 나는 현재지고있어 오류 메시지의 "승인되지 않은"로 전환됩니다.
Anders8

이 블로그는 원래의 토론처럼 앱의 모든 사용자에게만 메시지를 보내는 것이 아니라 특정 장치에 메시지를 보내는 것 같습니다.
Anders8 2017-07-01

자세한 내용은이 블로그 게시물 읽기-> 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
최고의 답변입니다. 앱 업데이트없이 즉시 실행할 수 있습니다. 큰!
톰 Marvolo 수수께끼

마침내 그 하나를 찾았습니다 – 그들은 그것을 사용하는 것이 더 분명하게 만들어야합니다
cwiesner

이것은 유망 해 보이지만 실제로 작동합니까? 해킹처럼 보입니다. 샘플 프로젝트에서 시도해 보았고 작동합니다. 그러나 수천 명의 활성 사용자가있는 내 prod 앱에서 작동하는지 확실하지 않습니다. 누구든지 prod 앱으로 시도해 보셨습니까?
Sahil Patel

4
나는이 접근 방식을 꽤 오랫동안 사용하고 완벽하게 작동했습니다. 오늘 어떤 이유로 알림을 레거시 api로 보내면 오류없이 message_id가 반환되지만 장치는 푸시 알림을받지 못합니다. 문제? 단일 토큰으로 보내기를 테스트했으며 정상적으로 작동했습니다.
Fernando Zamperin

1
@VitVeres Firebase 지원팀에 문제를 보냈고 그들은 "현재 푸시 알림을 팬 아웃하기위한 표현식 사용이 지원되지 않습니다. 표현식에 나열된 주제가 앱 프로젝트에 존재하는지 확인하세요."라고 답했습니다. 내 앱에서 주제를 구현해야 할 것 같습니다.
Fernando Zamperin

98

Firebase 알림에는 메시지를 보내는 API가 없습니다. 다행히도 정확히 그러한 API가있는 Firebase 클라우드 메시징을 기반으로 구축되었습니다.

Firebase 알림 및 클라우드 메시징을 사용하면 다음과 같은 세 가지 방법으로 기기에 소위 다운 스트림 메시지를 보낼 수 있습니다.

  1. 특정 장치 에 대한 장치 ID를 알고있는 경우
  2. 그룹의 등록 ID를 알고있는 경우 장치 그룹에
  3. 주제 장치가 가입 할 수있는 단지 열쇠,

모든 기기에 명시 적으로 전송할 수있는 방법은 없습니다. 예를 들어 앱이 시작될 때 주제를 구독 /topics/all하거나 (예 :) 모든 장치 ID 목록을 유지 한 다음 모든 장치 ID에 메시지를 전송하는 등 이러한 기능을 각각 사용하여 이러한 기능을 구축 할 수 있습니다 .

주제로 보내기 위해 명령에 구문 오류가 있습니다. 주제는로 시작하여 식별됩니다 /topics/. 코드에이 정보가 없기 때문에 서버 allDevices는 장치 ID로 해석 합니다. 기기 등록 토큰의 형식이 잘못 되었기 때문에 오류가 발생합니다.

주제에 메시지 보내기에 대한 문서에서 :

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": "This is a Firebase Cloud Messaging Topic Message!"}} 제출을 시도했고 동일한 InvalidRegistration 응답을 받았습니다. 나는 주제가 유효하지 않다는 것을 의미한다고 가정합니다. 콘솔에서 주제 데이터베이스를 볼 방법이 없습니다.
Anders8

7
/topics/복수입니다
프랭크 반 Puffelen

smirk 오, 오타, 프로그래머의 골칫거리. ;) 새 응답은 { "message_id": 5115052numbers95180}이며 확실히 훨씬 더 성공적으로 보입니다. 따라서 결론은 "알림"을 통해 알림을 전달하는 관리 콘솔의 강력한 기능이 있지만 API 제출에서 트리거하는 방법은 없으며 메시지를 사용하는 것으로 전환해야한다는 것입니다. (알림에 내장 된 일정 및 전환 추적을 잃음) 수신을 처리 할 메시징 코드를 찾아 보겠습니다. 고마워 프랭크. :)
Anders8

1
음 ...별로. 알림 콘솔은 알림 메시지 만 보냅니다 ( 메시지 유형에 대한 문서 참조 ). 아직 API가없는 유일한 일은 청중에게 보내는 것 입니다.
Frank van Puffelen 2016

1
iOS에서도 동일합니까? 나는 같은 노력 앱이 살아 때 알림을 수신하고 있지만, 백그라운드에서 작동하지 않습니다
vinbhai4u

72

모든 장치에 푸시 알림을 보내는 가장 쉬운 방법은 "all"주제를 구독 한 다음이 주제에 알림을 보내는 것입니다. 주요 활동에 복사

FirebaseMessaging.getInstance().subscribeToTopic("all");

이제 요청을 다음과 같이 보냅니다.

{
   "to":"/topics/all",
   "data":
   {
      "title":"Your title",
      "message":"Your message"
      "image-url":"your_image_url"
   }
}

이것은 비효율적이거나 비표준적인 방법 일 수 있지만 위에서 언급했듯이 가장 쉬운 방법입니다. 모든 장치에 푸시 알림을 보내는 더 좋은 방법이 있으면 게시하십시오 .

Firebase 클라우드 메시징 자습서 -FCM을 사용한 푸시 알림을 사용하여 푸시 알림을 처음 보내는 경우이 자습서를 따를 수 있습니다.


주제 조합 에 메시지를 보내려면 대상 주제를 지정하는 부울 표현식 인 condition 을 지정하십시오. 예를 들어 다음 조건은 또는 다음 TopicA중 하나에 가입 된 장치에 메시지를 보냅니다 .TopicBTopicC

{
   "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
나는 그것이 비효율적 생각하지 않습니다, 그것은 (내가 다른 방법이어야를 찾을 수 없습니다) 모든 기기에 푸시 알림을 보낼 수있는 유일한 방법이 될 수있다
에드 Rafay

1
베스트 답변! :)
wonsuc

2
좋은 대답입니다. 아무데도 언급되지 않았기 때문에 함수 에서 Service확장되는 이런 종류의 메시지를 받게 될 것임을 아는 것이 중요 합니다. 따라서 알림은 자동으로 표시되지 않으므로 직접 처리해야합니다. FirebaseMessagingService#onMessageReceived
reVerse

4

이를 수행하는 한 가지 방법은 모든 사용자의 기기에서 주제를 구독하도록하는 것입니다. 이렇게하면 메시지를 특정 주제로 지정하면 모든 장치에서 메시지를 받게됩니다. Firebase 콘솔의 알림 섹션이 어떻게 작동하는지 생각합니다.


자세한 내용은이 블로그 게시물 읽기-> developine.com/…
Developine

2

Ionic Cordova 앱 푸시 알림에 대한 솔루션을 찾고있었습니다.

Syed Rafay의 답변 덕분입니다.

에서 app.component.ts

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

에서 서버 파일

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

1

로그인 한 모든 사용자가 특정 주제를 구독하도록 한 다음 해당 주제에 알림을 보내면됩니다.


0

Firebase 콘솔에서 주제 목록을 확인하세요.

  1. Firebase 콘솔로 이동

  2. 사이드 메뉴에서 성장 을 클릭하십시오.

  3. 클라우드 메시징을 클릭하십시오.

  4. 첫 번째 메시지 보내기를 클릭 합니다.

  5. 알림 섹션에서 알림 제목알림 텍스트를 입력합니다.

  6. 다음을 클릭하십시오 .

  7. 대상 섹션에서 주제를 클릭하십시오.

  8. 메시지 주제 텍스트 상자를 클릭하면 주제 를 볼 수 있습니다 (Android 또는 ios라는 주제를 만들지 않았지만이 두 주제를 볼 수 있습니다.

  9. 푸시 알림을 보낼 때 이것을 조건으로 추가하십시오.

    "condition"=> " 'all'in topic || 'android'in topic || 'ios'in topic",

전신

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!",
   }
}

이 새로운 기능입니까? 아니면 "all"을 구독하는 앱이 필요합니까?
Anders8

기본 기능입니다. 나는 어떤 주제도 구독하지 않습니다. 그것은 나를 위해 일하고 있습니다. 하지만 토큰 등록을했습니다. "getToken"
Siva Karuppiah

1
예, 메시지 ID를 수신하지만 "all"이라는 주제가없는 한 어떤 장치로도 전송되지 않습니다.
Abdalrahman Shatou

아니요. Android 기기 (2 개)에서 알림을 받았습니다. 스크린 샷을 첨부 하시겠습니까?. Im은 ioinc 위에 내 앱을 빌드합니다.
Siva Karuppiah

이것은 나를 위해 작동합니다. 왜 이것이 비추천인지 모르겠습니다.
m1crdy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.