如何在不使用Firebase控制台的情况下发送Firebase Cloud Messaging通知?


200

我将从通知的新Google服务开始Firebase Cloud Messaging

多亏了这段代码https://github.com/firebase/quickstart-android/tree/master/messaging,我能够从Firebase用户控制台发送通知发送到Android设备。

是否有任何API或方法无需使用Firebase控制台即可发送通知?我的意思是,例如,一个PHP API或类似的东西,可以直接从我自己的服务器创建通知。


1
您在哪里托管服务器以发送通知?
罗德里戈·鲁伊斯


@David Corral,检查我的回答是否相同。 stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

已经写了一个春天应用发送FCM通知柜面你想看看它是如何工作- > github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniket塔库尔

您可以使用改造将设备消息传达给设备。stackoverflow.com/questions/37435750/…–
eurosecom

Answers:


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 '16

3
弗兰克·我(Frank I)遵循了Firebase文档和代码实验室的指南,在渐进式Web应用程序上添加了推送通知,并使用POstman发布了http请求,但我仍然收到401错误。有什么建议。我直接从Firebase控制台复制服务器密钥。
雅桑

25
如何发送给所有用户而不是特定用户或主题?
vinbhai4u

3
我在使用CURL代码片段的早期尝试中得到了以下错误消息:字段“ priority”必须为JSON数字:10。在最后删除10中的引号后,它起作用了。
阿尔伯特·c·布劳恩

2
@ vinbhai4u你得到答案了吗?我也坚持这一点。如何将其发送给所有应用程序用户?
罗希特

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控制台是否没有将推送消息数据保存到fcm.googleapis.com/fcm/send
Mahmudul Haque Khan

1
从我可以获取设备注册ID的浏览器发送推送通知?
阿米特·乔希

这很完美,但是由于我得到的文本太长{"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}。如何解决此问题?
Alisha Lamichhane,

@AlishaLamichhane您的消息是否大于4096字节?如果不是,则可以对消息进行base64编码(文本可能有问题)。如果它大于4096字节...那么,这就是FCM限制。
里克

47

使用服务API。

网址: 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天开始,我一直在努力和寻找。
拉维玛利亚

3
没关系。我找到了解决方案。to:“ / topics / all”会将通知发送到所有设备,或者如果您只想将IOS定位为iOS,请将所有替换为ios;对于android,则替换为'android'。这些是默认主题集。我猜。
拉维玛利亚


阅读此博客文章以了解更多详细信息-> developine.com/…–
Developine

@Ankit,您好,能否请您指定如何获取目标设备的ID?
阿南德·拉吉

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

您在哪里找到端点网址 fcm.googleapis.com/fcm/send,在Firebase文档中没有提及?
Utsav Gupta

1
您可以在此链接中找到firebase.google.com/docs/cloud-messaging/server
JR

@JR我创建了一个聊天应用程序,当用户向接收方发送消息时,接收方应该收到通知消息。在这种情况下,我该如何使用您的答案?那么,我应该为字段“ to”赋予值吗?
阿南德·拉吉

@ Anad Raj在我的回答中提到了“发送消息到特定设备”
JR

25

如Frank所述,您可以使用Firebase Cloud Messaging(FCM)HTTP API从您自己的后端触发推送通知。但是你将无法

  1. 发送通知到Firebase用户标识符(UID)并
  2. 向用户群发送通知(定位属性和事件,就像在用户控制台上一样)。

含义:您必须自己存储FCM / GCM注册ID(推送令牌)或使用FCM主题来订阅用户。还要记住,FCM不是Firebase Notifications的API,它是没有调度或开放速率分析的较低级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;
    }


?>


2

可以使用FCM HTTP v1 API端点将通知或数据消息发送到Firebase基本云消息传递服务器。 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");
}


1
您需要使用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发送推送通知,请查看我的博客文章

在没有服务器的情况下将推送通知从1部Android手机发送到另一部。

发送推送通知不过是对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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.