ฉันจะส่งการแจ้งเตือน Firebase Cloud Messaging โดยไม่ใช้คอนโซล Firebase ได้อย่างไร


200

ฉันเริ่มด้วยบริการใหม่ของ Google สำหรับการแจ้งเตือน, Firebase Cloud Messaging.

ขอบคุณรหัสนี้https://github.com/firebase/quickstart-android/tree/master/messagingฉันสามารถส่งการแจ้งเตือนจากคอนโซลผู้ใช้ Firebaseไปยังอุปกรณ์ Android ของฉัน

มี API หรือวิธีส่งการแจ้งเตือนโดยไม่ใช้คอนโซล Firebase หรือไม่? ฉันหมายถึงตัวอย่างเช่น PHP API หรืออะไรทำนองนั้นเพื่อสร้างการแจ้งเตือนจากเซิร์ฟเวอร์ของฉันเองโดยตรง


1
คุณโฮสต์เซิร์ฟเวอร์ของคุณเพื่อส่งการแจ้งเตือนที่ไหน
Rodrigo Ruiz


@ David Corral ตรวจสอบคำตอบของฉันเหมือนกัน stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

ได้เขียนแอปฤดูใบไม้ผลิที่จะส่งการแจ้งเตือน FCM กรณีที่คุณต้องการที่จะเห็นวิธีการทำงาน -> github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniket Thakur

คุณสามารถใช้ชุดติดตั้งเพิ่มเติมเพื่อ mesage davice to device stackoverflow.com/questions/37435750/…
eurosecom

คำตอบ:


218

Firebase Cloud Messaging มี API ฝั่งเซิร์ฟเวอร์ที่คุณสามารถโทรเพื่อส่งข้อความ ดูhttps://firebase.google.com/docs/cloud-messaging/server

การส่งข้อความสามารถทำได้ง่ายเพียงแค่ใช้curlเพื่อโทรหาจุดปลาย HTTP ดูที่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 ได้อย่างไร มันเป็นอุปกรณ์โทเค็นที่เราได้รับในdidRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSDataหรือหนึ่งในระยะเวลาที่เราได้รับกับFIRInstanceID.instanceID () โทเค็น (). ?
FelipeOliveira

3
Frank ฉันทำตามคำแนะนำที่ firebase docs และ codelabs เพื่อเพิ่มการแจ้งเตือนแบบพุชบน webapp แบบโปรเกรสซีฟและใช้ POstman เพื่อโพสต์คำขอ http แต่ฉันก็ยังได้รับข้อผิดพลาด 401 ข้อเสนอแนะใด ๆ ฉันกำลังคัดลอกคีย์เซิร์ฟเวอร์ของฉันโดยตรงจากคอนโซลฐานข้อมูลของฉัน
jasan

25
วิธีการส่งไปยังผู้ใช้ทั้งหมดมากกว่าผู้ใช้หรือหัวข้อเฉพาะ?
vinbhai4u

3
ฉันได้รับข้อความแสดงข้อผิดพลาดนี้ในหนึ่งในความพยายามครั้งแรกของฉันกับตัวอย่าง CURL: ฟิลด์ "ลำดับความสำคัญ" ต้องเป็นหมายเลข JSON: 10. หลังจากฉันลบเครื่องหมายคำพูดออกจาก 10 ในตอนท้ายมันทำงานได้
อัลเบิร์คเบราน์

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เป็นโทเค็นการลงทะเบียนอุปกรณ์

YOUR_KEY_HERE คือคีย์เซิร์ฟเวอร์ API ของคุณ (หรือรหัสเซิร์ฟเวอร์ API เดิม)


Firebase Console ไม่มีการบันทึกข้อมูลการส่งข้อความไปยังfcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan

1
ส่งการแจ้งเตือนแบบพุชไปยังเบราว์เซอร์จากที่ใดที่ฉันสามารถรับรหัสการลงทะเบียนอุปกรณ์
Amit Joshi

นี้ทำงานได้อย่างสมบูรณ์ {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}แต่เพราะข้อความยาวฉันได้รับ สิ่งที่สามารถทำได้ในการแก้ไขปัญหานี้คืออะไร?
Alisha Lamichhane

@AlishaLamichhane ข้อความของคุณใหญ่กว่า 4096 ไบต์ใช่ไหม ถ้าไม่ใช่คุณสามารถ base64 เข้ารหัสข้อความของคุณ (อาจมีบางอย่างผิดปกติกับข้อความ) หากมันมีขนาดใหญ่กว่า 4096 ไบต์ ... ดีนั่นคือขีด จำกัด FCM
Rik

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 ไม่ได้ถูกเรียกเมื่อแอปอยู่ในพื้นหลัง


แอนคิต, ฉันสามารถส่งไปที่ id อุปกรณ์เฉพาะ อย่างไรก็ตามฉันไม่สามารถส่งถึงทุกคนได้ ฉันควรใส่อะไร"to" : "to_id(firebase refreshedToken)"แทนรหัสอุปกรณ์ "all"ไม่ทำงานเลย ฉันใช้ C # WebRequestเพื่อส่งการแจ้งเตือน @AshikurRahman ข้อเสนอแนะของคุณยินดีต้อนรับ ฉันดิ้นรนและค้นหาตั้งแต่ 3-4 วัน
Ravimallya

3
ไม่เป็นไร. ฉันพบวิธีแก้ปัญหา ถึง: "/ topic / all" จะส่งการแจ้งเตือนไปยังอุปกรณ์ทั้งหมดหรือหากคุณต้องการกำหนดเป้าหมายเฉพาะ IOS แทนที่ทั้งหมดด้วย ios และสำหรับ Android ให้แทนที่ด้วย `android ' นี่คือชุดหัวข้อเริ่มต้น ฉันคิดว่า.
Ravimallya


อ่านบล็อกนี้เพื่ออ่านรายละเอียดเพิ่มเติม -> developine.com/…
Developine

@Ankit สวัสดีคุณช่วยระบุวิธีรับรหัสอุปกรณ์เป้าหมายได้หรือไม่
อานันท์ราชา

40

ตัวอย่างการใช้ขด

ส่งข้อความไปยังอุปกรณ์เฉพาะ

หากต้องการส่งข้อความไปยังอุปกรณ์เฉพาะให้ตั้งค่าเป็นโทเค็นการลงทะเบียนสำหรับอินสแตนซ์แอปที่เฉพาะเจาะจง

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

ส่งข้อความไปยังหัวข้อ

นี่คือหัวข้อ: / topic / 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

ส่งข้อความไปยังกลุ่มอุปกรณ์

การส่งข้อความไปยังกลุ่มอุปกรณ์นั้นคล้ายคลึงกับการส่งข้อความไปยังอุปกรณ์แต่ละชิ้น ตั้งค่าพารามิเตอร์เป็นคีย์การแจ้งเตือนเฉพาะสำหรับกลุ่มอุปกรณ์

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

ตัวอย่างการใช้ Service API

URL API: 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!"
  }
}

คุณพบจุดปลาย url fcm.googleapis.com/fcm/send ที่ไหนมันไม่ได้กล่าวถึงใน firebase doc
Utsav Gupta

1
คุณสามารถค้นหาได้ที่ลิงค์นี้firebase.google.com/docs/cloud-messaging/server
JR

@JR ฉันได้สร้างแอปพลิเคชั่นแชทซึ่งเมื่อผู้ใช้ส่งข้อความถึงผู้รับผู้รับควรได้รับข้อความแจ้งเตือน ในกรณีนี้ฉันจะใช้คำตอบของคุณได้อย่างไร ดังนั้นสิ่งที่ฉันควรจะให้ค่าสำหรับฟิลด์ "ถึง"?
อานันท์ราชา

@ Anad Raj อ้างถึง "ส่งข้อความไปยังอุปกรณ์เฉพาะ" ในคำตอบของฉัน
JR

25

ตามที่กล่าวไว้โดย Frank คุณสามารถใช้ Firebase Cloud Messaging (FCM) HTTP API เพื่อทริกเกอร์การแจ้งเตือนจากส่วนหลังของคุณเอง แต่คุณจะไม่สามารถ

  1. ส่งการแจ้งเตือนไปยัง Firebase User Identifier (UID) และ
  2. ส่งการแจ้งเตือนไปยังกลุ่มผู้ใช้ (การกำหนดเป้าหมายคุณสมบัติและกิจกรรมเช่นคุณบนคอนโซลผู้ใช้)

ความหมาย: คุณจะต้องเก็บรหัสการลงทะเบียน FCM / GCM (พุชโทเค็น) ด้วยตัวคุณเองหรือใช้หัวข้อ FCM เพื่อสมัครสมาชิกผู้ใช้ โปรดทราบว่าFCM ไม่ใช่ API สำหรับการแจ้งเตือน Firebaseเป็น API ระดับล่างโดยไม่มีการกำหนดตารางเวลาหรือการวิเคราะห์แบบเปิดเผย การแจ้งเตือนของ Firebase นั้นสร้างขึ้นบน FCM


6

ก่อนอื่นคุณต้องได้รับโทเค็นจาก Android และจากนั้นคุณสามารถเรียกรหัส 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;
    }


?>

3

คุณสามารถใช้ตัวอย่างสคริปต์ PHP สำหรับ Google Cloud Messaging (GCM) Firebase และคอนโซลอยู่ด้านบนของ GCM

ฉันพบสิ่งนี้ใน github: https://gist.github.com/prime31/5675017

คำแนะนำ: ผล PHP สคริปต์นี้ในการแจ้งเตือนหุ่นยนต์

ดังนั้น: อ่านคำตอบนี้จาก Kootหากคุณต้องการรับและแสดงการแจ้งเตือนใน Android


2

สามารถส่งการแจ้งเตือนหรือข้อความข้อมูลไปยังเซิร์ฟเวอร์การส่งข้อความบนคลาวด์ฐาน firebase โดยใช้จุดสิ้นสุด FCM HTTP v1 API https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send

คุณต้องสร้างและดาวน์โหลดรหัสส่วนตัวของบัญชีบริการโดยใช้คอนโซล Firebase และสร้างรหัสการเข้าถึงโดยใช้ห้องสมุดลูกค้าของ Google api ใช้ไลบรารี http ใด ๆ เพื่อโพสต์ข้อความไปยังจุดสิ้นสุดด้านบนรหัสด้านล่างแสดงข้อความการโพสต์โดยใช้ 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");
}

เพื่อนของฉันfcm.googleapis.com/v1/projects/zoftino-stores/messages: ส่งลิงก์นี้ดูเหมือนว่าจะหมดอายุแล้ว!
Naser Nikzad

1
คุณต้องใช้ url โครงการ google ของคุณไม่ใช่อันนั้นแทนที่ "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

หากคุณต้องการที่จะส่งการแจ้งเตือนจาก Android ตรวจสอบโพสต์บล็อกของฉัน

ส่งการแจ้งเตือนแบบพุชจากโทรศัพท์ Android 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 Console คุณสามารถส่งข้อความถึงผู้ใช้ทั้งหมดตามแพ็คเกจแอปพลิเคชัน แต่ไม่สามารถใช้ 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 ฉันขอแนะนำให้ใช้ PHP SDK สำหรับ Firebase: Firebase SDK สำหรับการกำหนดค่าอย่างง่ายคุณสามารถทำตามขั้นตอนเหล่านี้:

รับไฟล์ json หนังสือรับรองโครงการจาก Firebase (เตรียมใช้งาน sdk ) และรวมไว้ในโครงการของคุณ

ติดตั้ง SDK ในโครงการของคุณ ฉันใช้นักแต่งเพลง:

composer require kreait/firebase-php ^4.35

ลองตัวอย่างจากเซสชัน Cloud Messagingในเอกสารประกอบ SDK:

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.