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

기본적으로 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을 아는 사람이 있습니까?



답변

편집 :이 방법이 더 이상 지원되지 않는 것 같습니다 (@FernandoZamperin에 대해). 다른 답변을보세요!

주제를 구독하는 대신 condition키를 사용 하여 그룹에없는 인스턴스에 메시지를 보낼 수 있습니다. 데이터는 다음과 같을 수 있습니다.

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

https://firebase.google.com/docs/cloud-messaging/send-message#send_messages_to_topics_2를 참조 하세요.


답변

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


답변

모든 장치에 푸시 알림을 보내는 가장 쉬운 방법은 “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 문서의 조건 및 주제에 대해 자세히 알아보세요.


답변

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


답변

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

Syed Rafay의 답변 덕분입니다.

에서 app.component.ts

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

에서 서버 파일

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


답변

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


답변

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",
);

더 많은 주제가 있으면 추가 할 수 있습니다 || (또는) 조건, 그러면 모든 사용자가 알림을 받게됩니다. 나를 위해 테스트하고 일했습니다.