Firebase 콘솔을 사용하지 않고 Firebase 클라우드 메시징 알림을 보내려면 어떻게해야합니까?


200

알림에 대한 새로운 Google 서비스부터 시작하겠습니다 Firebase Cloud Messaging.

이 코드 덕분에 https://github.com/firebase/quickstart-android/tree/master/messagingFirebase 사용자 콘솔 에서 내 Android 기기 로 알림을 보낼 수있었습니다 .

Firebase 콘솔을 사용하지 않고 알림을 보내는 API 또는 방법이 있습니까? 예를 들어 PHP API 또는 이와 유사한 것을 사용하여 내 서버에서 직접 알림을 만듭니다.


1
알림을 보내기 위해 서버를 어디에서 호스팅하고 있습니까?
Rodrigo Ruiz


@David Corral, 같은 답변을 확인하십시오. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

FCM 알림을 보낼 수있는 스프링 응용 프로그램을 만들어 본 적이 것은 당신이 어떻게 작동하는지보고 싶은 넣다 -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
아니 켓 딴

개조를 사용하여 장치에 장치를 메시지로 보낼 수 있습니다. stackoverflow.com/questions/37435750/…
eurosecom 2012 년

답변:


218

Firebase Cloud Messaging에는 메시지를 보내기 위해 호출 할 수있는 서버 측 API가 있습니다. https://firebase.google.com/docs/cloud-messaging/server를 참조 하십시오. .

curlHTTP 엔드 포인트를 호출하는 데 사용 하는 것만 큼 ​​간단하게 메시지를 보낼 수 있습니다 . https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol을 참조 하십시오.

curl -X POST --header "Authorization: key=<API_ACCESS_KEY>" \
    --Header "Content-Type: application/json" \
    https://fcm.googleapis.com/fcm/send \
    -d "{\"to\":\"<YOUR_DEVICE_ID_TOKEN>\",\"notification\":{\"body\":\"Yellow\"},\"priority\":10}"

4
iOS에서 기기 ID를 얻으려면 어떻게해야하나요? 우리가 얻은 장치 토큰은 didRegisterForRemoteNotificationsWithDeviceToken deviceToken : NSData 또는 FIRInstanceID.instanceID (). token ()으로 얻는 긴 토큰 입니까?
FelipeOliveira

3
Frank 나는 firebase 문서 및 codelabs의 가이드를 따라 점진적 webapp에 푸시 알림을 추가하고 POstman을 사용하여 http 요청을 게시했지만 401 오류가 계속 발생합니다. 모든 제안. Firebase 콘솔에서 직접 서버 키를 복사하고 있습니다.
jasan

25
특정 사용자 나 주제가 아닌 모든 사용자에게 보내는 방법
vinbhai4u

3
CURL 스 니펫을 사용하여 초기 시도 중 하나에서이 오류 메시지가 다시 나타납니다. "priority"필드는 JSON 번호 여야합니다. 10. 10에서 따옴표를 제거한 후 끝났습니다.
albert c braun

2
@ vinbhai4u 답을 얻습니까? 나는 또한 그것에 붙어 있습니다. 모든 응용 프로그램 사용자에게 보내는 방법은 무엇입니까?
Rohit

51

이것은 CURL을 사용하여 작동합니다.

function sendGCM($message, $id) {


    $url = 'https://fcm.googleapis.com/fcm/send';

    $fields = array (
            'registration_ids' => array (
                    $id
            ),
            'data' => array (
                    "message" => $message
            )
    );
    $fields = json_encode ( $fields );

    $headers = array (
            'Authorization: key=' . "YOUR_KEY_HERE",
            'Content-Type: application/json'
    );

    $ch = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

    $result = curl_exec ( $ch );
    echo $result;
    curl_close ( $ch );
}

?>

$message 기기로 보낼 메시지입니다

$id는 IS 장치 등록 토큰

YOUR_KEY_HERE 서버 API 키 (또는 레거시 서버 API 키)


Firebase 콘솔에 푸시 메시지 데이터를 fcm.googleapis.com/fcm/send에 저장하지 않았 습니까?
Mahmudul Haque Khan

1
장치 등록 ID를 얻을 수있는 브라우저로 푸시 알림을 보내는 방법은 무엇입니까?
Joshi를

이것은 완벽하게 작동하지만 긴 텍스트 때문에 {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. 이 문제를 해결하기 위해 무엇을 할 수 있습니까?
Alisha Lamichhane

@AlishaLamichhane 메시지가 4096 바이트보다 큽니까? 그렇지 않은 경우 메시지를 base64로 인코딩 할 수 있습니다 (텍스트에 문제가있을 수 있음). 4096 바이트보다 크면 FCM 한도입니다.

47

서비스 API를 사용하십시오.

URL : https://fcm.googleapis.com/fcm/send

방법 유형 : POST

헤더 :

Content-Type: application/json
Authorization: key=your api key

바디 / 페이로드 :

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

그리고 이것을 앱에서 사용하면 활동에 아래 코드를 추가하여 호출 할 수 있습니다.

<intent-filter>
    <action android:name="OPEN_ACTIVITY_1" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

또한 백그라운드에서 앱을 사용할 때 Firebase onMessageReceived에서 호출되지 않은 응답을 확인하십시오.


Ankit, 특정 장치 ID로 보낼 수 있습니다. 그러나 모든 사람에게 보낼 수는 없습니다. "to" : "to_id(firebase refreshedToken)"장치 ID 대신 무엇을 넣어야 합니까? "all"전혀 작동하지 않습니다. C # WebRequest을 사용하여 알림을 보냅니다. @AshikurRahman 제안도 환영합니다. 3-4 일 이후 어려움을 겪고 있습니다.
Ravimallya 2012

3
신경 쓰지 마. 해결책을 찾았습니다. to : "/ topics / all"은 모든 장치에 알림을 보내거나 IOS 만 대상으로 ios로 바꾸고 Android의 경우`android '로 바꾸십시오. 이것이 기본 주제 세트입니다. 나는 추측한다.
Ravimallya 2012


자세한 내용은이 blogpost를 읽으십시오-> developine.com/…
Developine

@Ankit, 안녕하세요, 대상 장치의 ID를 얻는 방법을 지정할 수 있습니까?
Anand Raj

40

curl을 사용하는 예

특정 장치로 메시지 보내기

특정 기기로 메시지를 보내려면 특정 앱 인스턴스의 등록 토큰으로

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "data": { "score": "5x1","time": "15:10"},"to" : "<registration token>"}' https://fcm.googleapis.com/fcm/send

주제에 메시지 보내기

여기 주제는 / topics / foo-bar입니다.

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "to": "/topics/foo-bar","data": { "message": "This is a Firebase Cloud Messaging Topic Message!"}}' https://fcm.googleapis.com/fcm/send

장치 그룹에 메시지 보내기

장치 그룹으로 메시지를 보내는 것은 개별 장치로 메시지를 보내는 것과 매우 유사합니다. to 매개 변수를 장치 그룹의 고유 알림 키로 설정하십시오.

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{"to": "<aUniqueKey>","data": {"hello": "This is a Firebase Cloud Messaging Device Group Message!"}}' https://fcm.googleapis.com/fcm/send

서비스 API를 사용하는 예

API URL : https://fcm.googleapis.com/fcm/send

헤더

Content-type: application/json
Authorization:key=<Your Api key>

요청 방법 : POST

요청 본문

특정 장치에 대한 메시지

{
  "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to": "<registration token>"
}

주제에 대한 메시지

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!"
  }
}

장치 그룹에 대한 메시지

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}

Firebase Doc에서 언급하지 않은 엔드 포인트 URL fcm.googleapis.com/fcm/send를 어디에서 찾았 습니까?
Utsav Gupta

1
당신은이 링크에서 그것을 찾을 수 있습니다 firebase.google.com/docs/cloud-messaging/server
JR

@ JR 나는 사용자가 수신자에게 메시지를 보낼 때 수신자가 알림 메시지를 받아야하는 채팅 응용 프로그램을 만들었습니다. 이 경우 어떻게 대답을 사용할 수 있습니까? 따라서 "~"필드의 값을 어떻게 지정해야합니까?
Anand Raj

@ Anad Raj 내 답변에서 "특정 장치로 메시지 보내기"참조
JR

25

Frank가 언급 한 것처럼 FCM (Firebase Cloud Messaging) HTTP API를 사용하여 자신의 백엔드에서 푸시 알림을 트리거 할 수 있습니다. 그러나 당신은 할 수 없습니다

  1. Firebase 사용자 식별자 (UID)에 알림을 보내고
  2. 사용자 세그먼트에 알림을 보냅니다 (사용자 콘솔에서 할 수있는 것처럼 대상 속성 및 이벤트).

의미 : FCM / GCM 등록 ID (푸시 토큰)를 직접 저장하거나 FCM 주제를 사용하여 사용자를 구독해야합니다. 마음에 또한 유지 FCM은 중포 기지 알림에 대한 API 아니다 , 그것은 일정 또는 개방 속도 분석없이 낮은 수준의 API입니다. Firebase 알림은 FCM에 구축되어 있습니다.


6

먼저 안드로이드에서 토큰을 가져와야 하고이 PHP 코드를 호출 할 수 있으며 앱에서 추가 작업을 위해 데이터를 보낼 수도 있습니다.

 <?php

// Call .php?Action=M&t=title&m=message&r=token
$action=$_GET["Action"];


switch ($action) {
    Case "M":
         $r=$_GET["r"];
        $t=$_GET["t"];
        $m=$_GET["m"];

        $j=json_decode(notify($r, $t, $m));

        $succ=0;
        $fail=0;

        $succ=$j->{'success'};
        $fail=$j->{'failure'};

        print "Success: " . $succ . "<br>";
        print "Fail   : " . $fail . "<br>";

        break;


default:
        print json_encode ("Error: Function not defined ->" . $action);
}

function notify ($r, $t, $m)
    {
    // API access key from Google API's Console
        if (!defined('API_ACCESS_KEY')) define( 'API_ACCESS_KEY', 'Insert here' );
        $tokenarray = array($r);
        // prep the bundle
        $msg = array
        (
            'title'     => $t,
            'message'     => $m,
           'MyKey1'       => 'MyData1',
            'MyKey2'       => 'MyData2', 

        );
        $fields = array
        (
            'registration_ids'     => $tokenarray,
            'data'            => $msg
        );

        $headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );

        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'fcm.googleapis.com/fcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
        return $result;
    }


?>


2

FCM HTTP v1 API 엔드 포인트를 사용하여 알림 또는 데이터 메시지를 firebase 기본 클라우드 메시징 서버로 보낼 수 있습니다. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Firebase 콘솔을 사용하여 개인 서비스 키 계정을 생성 및 다운로드하고 Google API 클라이언트 라이브러리를 사용하여 액세스 키를 생성해야합니다. 아래의 코드는 OkHTTP를 사용하여 메시지를 게시하는 것을 보여줍니다. Firebase 클라우드 메시징 에서 전체 서버 측 및 클라이언트 측 코드를 찾고 fcm 주제 예를 사용하여 여러 클라이언트에게 메시지를 보낼 수 있습니다

특정 클라이언트 메시지를 보내야하는 경우 클라이언트의 Firebase 등록 키를 가져와야 합니다 (FCM 서버로 클라이언트 또는 기기 별 메시지 보내기 예 참조).

String SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
String FCM_ENDPOINT
     = "https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send";

GoogleCredential googleCredential = GoogleCredential
    .fromStream(new FileInputStream("firebase-private-key.json"))
    .createScoped(Arrays.asList(SCOPE));
googleCredential.refreshToken();
String token = googleCredential.getAccessToken();



final MediaType mediaType = MediaType.parse("application/json");

OkHttpClient httpClient = new OkHttpClient();

Request request = new Request.Builder()
    .url(FCM_ENDPOINT)
    .addHeader("Content-Type", "application/json; UTF-8")
    .addHeader("Authorization", "Bearer " + token)
    .post(RequestBody.create(mediaType, jsonMessage))
    .build();


Response response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
    log.info("Message sent to FCM server");
}


1
"zotino-stores"를 프로젝트 이름으로 바꾸십시오
Arnav Rao

2

링크 에서이 솔루션 많은 도움 되었습니다. 당신은 그것을 확인할 수 있습니다.

해당 명령 줄이있는 curl.php 파일이 작동 할 수 있습니다.

<?php 
// Server key from Firebase Console define( 'API_ACCESS_KEY', 'AAAA----FE6F' );
$data = array("to" => "cNf2---6Vs9", "notification" => array( "title" => "Shareurcodes.com", "body" => "A Code Sharing Blog!","icon" => "icon.png", "click_action" => "http://shareurcodes.com"));
$data_string = json_encode($data);
echo "The Json Data : ".$data_string;
$headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' );
$ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_POSTFIELDS, $data_string);
$result = curl_exec($ch);
curl_close ($ch);
echo "<p>&nbsp;</p>";
echo "The Result : ".$result;

생각해 내다 you need to execute curl.php file using another browser ie not from the browser that is used to get the user token. You can see notification only if you are browsing another website.


0

안드로이드에서 푸시 알림을 보내려면 내 블로그 게시물을 확인하십시오.

서버가없는 1 개의 안드로이드 폰에서 다른 폰으로 푸시 알림을 보냅니다.

푸시 알림을 보내는 것은 https://fcm.googleapis.com/fcm/send에 대한 게시 요청 일뿐입니다.

발리를 사용하는 코드 스 니펫 :

    JSONObject json = new JSONObject();
 try {
 JSONObject userData=new JSONObject();
 userData.put("title","your title");
 userData.put("body","your body");

json.put("data",userData);
json.put("to", receiverFirebaseToken);
 }
 catch (JSONException e) {
 e.printStackTrace();
 }

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://fcm.googleapis.com/fcm/send", json, new Response.Listener<JSONObject>() {
 @Override
 public void onResponse(JSONObject response) {

Log.i("onResponse", "" + response.toString());
 }
 }, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {

}
 }) {
 @Override
 public Map<String, String> getHeaders() throws AuthFailureError {

Map<String, String> params = new HashMap<String, String>();
 params.put("Authorizationey=" + SERVER_API_KEY);
 params.put("Content-Typepplication/json");
 return params;
 }
 };
 MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);

자세한 내용은 내 블로그 게시물을 확인하시기 바랍니다.



0

Firebase 콘솔을 사용하면 애플리케이션 패키지를 기반으로 모든 사용자에게 메시지를 보낼 수 있지만 CURL 또는 PHP API로는 불가능합니다.

API를 통해 특정 장치 ID 또는 구독 한 사용자에게 선택한 주제 또는 구독 된 주제 사용자에게 알림을 보낼 수 있습니다.

Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message


0

PHP를 사용하는 경우 Firebase 용 PHP SDK : Firebase Admin SDK 를 사용하는 것이 좋습니다. . 쉬운 구성을 위해 다음 단계를 수행 할 수 있습니다.

Firebase에서 프로젝트 자격 증명 json 파일 가져 오기 ( SDK 초기화) ) 프로젝트에 포함하십시오.

프로젝트에 SDK를 설치하십시오. 작곡가를 사용합니다 :

composer require kreait/firebase-php ^4.35

SDK 설명서 의 Cloud Messaging 세션 에서 예제를 사용해보십시오 .

use Kreait\Firebase;
use Kreait\Firebase\Messaging\CloudMessage;

$messaging = (new Firebase\Factory())
->withServiceAccount('/path/to/firebase_credentials.json')
->createMessaging();

$message = CloudMessage::withTarget(/* see sections below */)
    ->withNotification(Notification::create('Title', 'Body'))
    ->withData(['key' => 'value']);

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