Làm cách nào tôi có thể gửi thông báo Firebase Cloud Messaging mà không cần sử dụng Bảng điều khiển Firebase?


200

Tôi đang bắt đầu với dịch vụ mới của Google cho các thông báo , Firebase Cloud Messaging.

Nhờ mã này https://github.com/firebase/quickstart-android/tree/master/messaging Tôi đã có thể gửi thông báo từ Bảng điều khiển người dùng Firebase đến thiết bị Android của mình.

Có bất kỳ API hoặc cách nào để gửi thông báo mà không cần sử dụng bảng điều khiển Firebase không? Ý tôi là, ví dụ, API PHP hoặc một cái gì đó tương tự, để tạo thông báo trực tiếp từ máy chủ của riêng tôi.


1
Bạn đang lưu trữ máy chủ ở đâu để gửi thông báo?
Rodrigo Ruiz


@David Corral, Kiểm tra câu trả lời của tôi cho cùng. stackoverflow.com/a/38992689/2122328
Sandeep_Devhare 17/8/2016

Đã viết một ứng dụng mùa xuân để gửi thông báo FCM trong trường hợp bạn muốn xem nó hoạt động như thế nào -> github.com/aniket91/WebDOUNDo/blob/master/src/com/osfg/iêu
Aniket Thakur

Bạn có thể sử dụng retrofit để mesage davice vào thiết bị. stackoverflow.com/questions/37435750/ móc
eurosecom

Câu trả lời:


218

Firebase Cloud Messaging có API phía máy chủ mà bạn có thể gọi để gửi tin nhắn. Xem https://firebase.google.com/docs/cloud-messaging/server .

Gửi tin nhắn có thể đơn giản như sử dụng curlđể gọi điểm cuối HTTP. Xem https://firebase.google.com/docs/cloud-messaging/server#imâying-http -connection-server-protatio

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
Làm cách nào tôi có thể lấy id thiết bị trên iOS? Đây có phải là mã thông báo thiết bị mà chúng tôi nhận được trên didRegisterForRemoteNotutionsWithDeviceToken deviceToken: NSData hoặc cái dài mà chúng tôi nhận được với FIRInstanceID.instanceID (). Token () ?
FelipeOliveira

3
Frank I đã làm theo hướng dẫn tại docbase và codelabs để thêm thông báo đẩy trên một ứng dụng web tiến bộ và sử dụng POstman để gửi yêu cầu http, nhưng tôi vẫn nhận được lỗi 401. Bất kỳ đề xuất. Tôi đang sao chép khóa máy chủ của mình trực tiếp từ bảng điều khiển căn cứ hỏa lực của mình.
jasan

25
Làm thế nào để gửi cho tất cả người dùng thay vì một người dùng hoặc chủ đề cụ thể?
vinbhai4u

3
Tôi đã nhận được thông báo lỗi này trong một trong những lần thử đầu tiên của tôi với đoạn mã CURL: "mức độ ưu tiên" của trường phải là số JSON: 10. Sau khi tôi xóa dấu ngoặc kép từ số 10 ở cuối, nó đã hoạt động.
albert c braun

2
@ vinbhai4u Bạn có nhận được câu trả lời không? Tôi cũng bị mắc kẹt ở đó. Làm thế nào để gửi nó cho tất cả người dùng ứng dụng?
Rohit

51

Điều này hoạt động bằng cách sử dụng 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 là tin nhắn của bạn để gửi đến thiết bị

$idmã thông báo đăng ký thiết bị

YOUR_KEY_HERE là Khóa API máy chủ của bạn (hoặc Khóa API máy chủ kế thừa)


Bảng điều khiển Firebase không lưu dữ liệu nhắn tin đẩy vào fcm.googleapis.com/fcm/send ?
Mahmudul Haque Khan

1
để gửi thông báo đẩy tới trình duyệt từ nơi tôi có thể nhận id đăng ký thiết bị?
Amit Joshi

Điều này hoạt động hoàn hảo, nhưng vì văn bản dài tôi đang nhận được {"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}. Có thể làm gì để khắc phục điều này?
Alisha Lamichhane

@AlishaLamichhane Tin nhắn của bạn có lớn hơn 4096 byte không? Nếu không, bạn có thể mã hóa base64 tin nhắn của bạn (có thể có gì đó không đúng với văn bản). Nếu nó lớn hơn 4096 byte ... tốt, đó là giới hạn FCM.
Rik

47

Sử dụng một dịch vụ api.

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

Loại phương thức: POST

Tiêu đề:

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

Thân / Tải trọng:

{ "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)"
} 

Và với điều này trong ứng dụng của bạn, bạn có thể thêm mã bên dưới vào hoạt động của mình để được gọi:

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

Đồng thời kiểm tra câu trả lời trên Firebase onMessageReceured không được gọi khi ứng dụng chạy nền


Ankit, tôi có thể gửi đến id thiết bị cụ thể. Tuy nhiên, tôi không thể gửi cho tất cả. Tôi nên đặt gì "to" : "to_id(firebase refreshedToken)"thay vì id thiết bị? "all"hoàn toàn không hoạt động. Tôi đang sử dụng C # WebRequestđể gửi thông báo. @AshikurRahman đề nghị của bạn cũng được chào đón. Tôi đang vật lộn và tìm kiếm từ 3-4 ngày.
Ravimallya

3
Đừng bận tâm. Tôi tìm thấy giải pháp. đến: "/ chủ đề / tất cả" sẽ gửi thông báo cho tất cả các thiết bị hoặc nếu bạn muốn nhắm mục tiêu chỉ iOS thay thế tất cả bằng ios và cho Android, hãy thay thế bằng 'android'. Đây là những chủ đề mặc định được thiết lập. Tôi đoán.
Ravimallya


Đọc bài đăng trên blog này để biết thêm chi tiết -> developine.com/...
Developine

@Ankit, Xin chào, bạn có thể vui lòng chỉ định cách lấy id của thiết bị đích không?
Anand Raj

40

Ví dụ sử dụng curl

Gửi tin nhắn đến các thiết bị cụ thể

Để gửi tin nhắn đến các thiết bị cụ thể, hãy đặt mã thông báo đăng ký cho phiên bản ứng dụng cụ thể

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

Gửi tin nhắn đến chủ đề

ở đây chủ đề là: / chủ đề / 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

Gửi tin nhắn đến các nhóm thiết bị

Gửi tin nhắn đến một nhóm thiết bị rất giống với gửi tin nhắn đến một thiết bị riêng lẻ. Đặt tham số thành khóa thông báo duy nhất cho nhóm thiết bị

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

Ví dụ sử dụng API dịch vụ

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

Tiêu đề

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

Phương thức yêu cầu: POST

Yêu cầu cơ thể

Tin nhắn đến các thiết bị cụ thể

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

Tin nhắn cho chủ đề

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

Tin nhắn cho các nhóm thiết bị

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

Bạn đã tìm thấy url điểm cuối fcm.googleapis.com/fcm/send , nó không được đề cập trong tài liệu firebase ở đâu?
Utsav Gupta

1
Bạn có thể thấy rằng trong liên kết này firebase.google.com/docs/cloud-messaging/server
JR

@JR Tôi đã tạo một ứng dụng trò chuyện trong đó khi người dùng gửi tin nhắn đến người nhận, người nhận sẽ nhận được tin nhắn thông báo. Trong trường hợp này làm thế nào tôi có thể sử dụng câu trả lời của bạn? Vậy tôi phải làm gì để đưa ra giá trị cho trường "thành"?
Anand Raj

@ Anad Raj giới thiệu "Gửi tin nhắn đến các thiết bị cụ thể" trong câu trả lời của tôi
JR

25

Như Frank đã đề cập, bạn có thể sử dụng API HTTP của Firebase Cloud Messaging (FCM) để kích hoạt thông báo đẩy từ phía sau của chính bạn. Nhưng bạn sẽ không thể

  1. gửi thông báo đến Mã nhận dạng người dùng Firebase (UID) và
  2. gửi thông báo đến phân khúc người dùng (nhắm mục tiêu thuộc tính & sự kiện như bạn có thể trên bảng điều khiển người dùng).

Ý nghĩa: bạn sẽ phải tự lưu trữ id đăng ký FCM / GCM (mã thông báo đẩy) hoặc sử dụng các chủ đề FCM để đăng ký người dùng. Cũng nên nhớ rằng FCM không phải là API dành cho Thông báo Firebase , đây là API cấp thấp hơn mà không cần lập lịch hoặc phân tích tỷ lệ mở. Thông báo Firebase được xây dựng trên đầu trang trên FCM.


6

Trước tiên, bạn cần nhận mã thông báo từ Android và sau đó bạn có thể gọi mã php này và thậm chí bạn có thể gửi dữ liệu cho các hành động tiếp theo trong ứng dụng của mình.

 <?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

Thông báo hoặc tin nhắn dữ liệu có thể được gửi đến máy chủ nhắn tin đám mây cơ sở firebase bằng cách sử dụng điểm cuối API FCM HTTP v1. https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send .

Bạn cần tạo và tải xuống khóa riêng của tài khoản dịch vụ bằng bảng điều khiển Firebase và tạo khóa truy cập bằng thư viện ứng dụng khách google api. Sử dụng bất kỳ thư viện http nào để gửi tin nhắn đến điểm cuối bên trên, bên dưới mã hiển thị thông báo đăng bài bằng OkHTTP. Bạn có thể tìm thấy mã phía máy chủ và máy khách hoàn chỉnh tại tin nhắn đám mây firebase và gửi tin nhắn đến nhiều khách hàng bằng ví dụ chủ đề fcm

Nếu một tin nhắn khách hàng cụ thể cần gửi, bạn cần lấy khóa đăng ký firebase của khách hàng, xem gửi tin nhắn cụ thể của khách hàng hoặc thiết bị đến ví dụ máy chủ 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");
}

Bạn của tôi, fcm.googleapis.com/v1/projects/zoftino-stores/messages:send liên kết này dường như đã hết hạn!
Naser Nikzad

1
Bạn cần sử dụng url dự án google của mình, không phải url đó, thay thế "zotino-store" bằng tên dự án của bạn
Arnav Rao

2

giải pháp này từ liên kết này đã giúp tôi rất nhiều. bạn có thể kiểm tra nó

Tệp curl.php với các dòng hướng dẫn có thể hoạt động.

<?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;

Nhớ lại 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

Nếu bạn muốn gửi thông báo đẩy từ Android, hãy xem bài đăng trên blog của tôi

Gửi thông báo đẩy từ 1 điện thoại Android sang máy chủ khác.

gửi thông báo đẩy không có gì ngoài một yêu cầu bài đăng tới https://fcm.googleapis.com/fcm/send

đoạn mã bằng cách sử dụng bóng chuyền:

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

Tôi đề nghị tất cả các bạn kiểm tra bài viết trên blog của tôi để biết chi tiết đầy đủ.



0

Sử dụng Bảng điều khiển Firebase, bạn có thể gửi tin nhắn cho tất cả người dùng dựa trên gói ứng dụng. Nhưng với API CURL hoặc PHP thì không thể.

Thông qua API Bạn có thể gửi thông báo đến ID thiết bị cụ thể hoặc người dùng đã đăng ký cho chủ đề được chọn hoặc người dùng chủ đề đã đăng ký.

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


0

Nếu bạn đang sử dụng PHP, tôi khuyên bạn nên sử dụng SDK PHP cho Firebase: SDK quản trị Firebase . Để có cấu hình dễ dàng, bạn có thể làm theo các bước sau:

Nhận tệp json thông tin đăng nhập dự án từ Firebase ( Khởi tạo sdk ) và đưa nó vào dự án của bạn.

Cài đặt SDK trong dự án của bạn. Tôi sử dụng nhà soạn nhạc:

composer require kreait/firebase-php ^4.35

Hãy thử bất kỳ ví dụ nào từ phiên Nhắn tin trên đám mây trong tài liệu 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.