如何在服务器端实现Firebase云消息传递?

11

迁移到Firebase后,我使用Firebase控制台测试发送通知功能,发现它可以正常工作。但是我需要在特定时间每天发送通知,所以我改用以前的cron job来实现每日通知的发送。我将 https://android.googleapis.com/gcm/send 更改为 https://fcm.googleapis.com/fcm/send ,但我的设备没有收到任何通知。

有没有什么解决方法?还是我漏了什么?我的cron job对于仍在使用GCM的设备可以正常工作。

这是我的代码:

function sendNotificationFCM($apiKey, $registrationIDs, $messageText,$id) {


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

    $message = array(
            'registration_ids' => $registrationIDs,
            'data' => array(
                    "message" => $messageText,
                    "id" => $id,
            ),
    );


    $ch = curl_init();

    curl_setopt_array($ch, array(
            CURLOPT_URL => 'https://fcm.googleapis.com/fcm/send',
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => json_encode($message)
    ));

    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
}

1
根据我在https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocol中所读到的,它说要发送消息,应用程序服务器需要发出POST请求。例如: 'https.fcm.googleapis.com/fcm/send' - natsumiyu
我会努力四处寻找,如果我找到什么就会告诉你。 :) - AL.
顺便问一下,你是否收到服务器的响应了? - AL.
看起来你的做法是正确的,只是不完全。我会删除我的第一条评论以避免未来的混淆。 - AL.
@McAwesomville 是的,我正在从我的服务器接收响应。 - natsumiyu
显示剩余2条评论
4个回答

12

我在我的JSON中添加了notification对象。 我发现在remoteMessage.getNotification().getBody()中返回null,这就是为什么它没有接收到由我的计划任务发送的任何通知。

编辑

这是我的JSON对象

$message = array(
            'registration_ids' => $registrationIDs,
            'notification' => array(
                                    "title" => $id, 
                                    "body" => $messageText,
                                    "icon" => "name_of_icon" ),
            'data' => array(
                    "message" => $messageText,
                    "id" => $id,
            ),
    );

如果它能正常工作,你可以分享一下你发送的JSON对象吗? - Blacksad
@Blacksad 我添加了我的JSON对象。 - natsumiyu
@mori 非常感谢 - Raghavendra B
我不使用curl。我该如何在Google Endpoints Cloud模块中实现服务器端? - Edijae Crusar
这里的 'name_of_icon' 是什么?是一个 HTTP URL 还是类似于 assets/images/icon.png 的资源路径?请建议一下。谢谢。 - Kamlesh

9

除了将URL更改为以下内容:

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

您还需要更改发送请求数据的方式:

 Content-Type:application/json
 Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

 {
   "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", // "to" replaces "registration_ids" of gcm in fcm
   "data" : {
   ...
  },
}

看看这份完整指南


作为错误状态,Field "to" must be a JSON string:;您发送的请求数据不是一个正确的JSON格式。您可以通过一些在线JSON验证器进行检查。如果它是正确的,那么事情应该能够正常工作。 - uniruddh
在 JSON 验证器上检查它,它显示这是一个有效的 JSON。 - natsumiyu
我可以在“to”里放置多个标记吗? - natsumiyu
我怎样才能得到任何设备的 "to" ?我应该在应用中请求一个 API 获取设备的 "to" 吗? - Ali Soltani
每个安装的应用程序都会收到唯一的设备ID,您需要将其存储在服务器上。请查看此链接:https://firebase.google.com/docs/cloud-messaging/android/client - uniruddh
显示剩余3条评论

1

我无法直接在所选答案中进行评论。请注意,json消息会根据您想要/需要在接收方操作系统(android / ios)中接收的内容而发生变化。

例如,对于Android来说,如果要在应用程序处于后台时获取通知,则需要在请求中添加数据 json。

对于iOS,不需要数据键,但必须将通知键与isContentAvailble标志设置为true并将优先级设置为高。

在所选答案中,您使用registration_ids键仅应在向多个设备发送通知时使用,也许您应该查看主题通知。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接