如何在服务器端实现 firebase 云消息传递?
How to implement firebase cloud messaging in server side?
迁移到 Firebase 后,我测试了使用 firebase 控制台发送通知,它工作正常,但我需要在特定时间每天发送通知,所以我没有使用 firebase 控制台,而是使用我以前的 cron 作业每天发送通知.我将 https://android.googleapis.com/gcm/send
更改为 https://fcm.googleapis.com/fcm/send
但我的设备没有收到任何通知。
有什么办法可以解决吗?或者我错过了什么?我的 cron 作业在我仍在使用 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;
}
除了将 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" : {
...
},
}
我在 json 中添加了 notification
对象。
我发现在我的 remoteMessage.getNotification().getBody()
中它 returns null 这就是为什么它没有收到我的 cron 发送的任何通知。
编辑
这是我的 json 对象
$message = array(
'registration_ids' => $registrationIDs,
'notification' => array(
"title" => $id,
"body" => $messageText,
"icon" => "name_of_icon" ),
'data' => array(
"message" => $messageText,
"id" => $id,
),
);
试试用这个:)
我无法直接在所选答案中发表评论。考虑到 json 消息会根据您 want/need 在收件人 os 中收到的内容而变化 (android/ios)。
例如 android 要在应用程序处于后台时获取通知,您需要在请求中添加 data json。
对于 iOS 不需要数据密钥,但您必须设置 notification 密钥以及 isContentAvailble 标志为真,优先级设置为高。
In the selected answer as valid, you use registration_ids key should only used when you are sending the notification to more than one device, maybe you should take查看主题通知。
迁移到 Firebase 后,我测试了使用 firebase 控制台发送通知,它工作正常,但我需要在特定时间每天发送通知,所以我没有使用 firebase 控制台,而是使用我以前的 cron 作业每天发送通知.我将 https://android.googleapis.com/gcm/send
更改为 https://fcm.googleapis.com/fcm/send
但我的设备没有收到任何通知。
有什么办法可以解决吗?或者我错过了什么?我的 cron 作业在我仍在使用 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;
}
除了将 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" : {
...
},
}
我在 json 中添加了 notification
对象。
我发现在我的 remoteMessage.getNotification().getBody()
中它 returns null 这就是为什么它没有收到我的 cron 发送的任何通知。
编辑
这是我的 json 对象
$message = array(
'registration_ids' => $registrationIDs,
'notification' => array(
"title" => $id,
"body" => $messageText,
"icon" => "name_of_icon" ),
'data' => array(
"message" => $messageText,
"id" => $id,
),
);
试试用这个:)
我无法直接在所选答案中发表评论。考虑到 json 消息会根据您 want/need 在收件人 os 中收到的内容而变化 (android/ios)。
例如 android 要在应用程序处于后台时获取通知,您需要在请求中添加 data json。
对于 iOS 不需要数据密钥,但您必须设置 notification 密钥以及 isContentAvailble 标志为真,优先级设置为高。
In the selected answer as valid, you use registration_ids key should only used when you are sending the notification to more than one device, maybe you should take查看主题通知。