通过cURL / PHP发送时,设备上未收到Firebase通知

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过cURL / PHP发送时,设备上未收到Firebase通知相关的知识,希望对你有一定的参考价值。

我有一个ios应用程序,它在应用商店中存在。我可以将推送通知发送到已安装该应用的iOS设备,但仅限于我从Firebase控制台发送它们时。

当我尝试通过cURL请求发送推送通知时,来自服务器的响应表明我已成功但未在设备上收到消息。我已尝试使用多播和单个收件人有效负载。

我必须遗漏一些更基本的东西,但我看不到它。

这是我的php代码:

<?php
// API access key from Google API's Console
define( 'API_ACCESS_KEY', 'AI*****4LPGkx8xtDG2tBl*****7KWJfmp1szcA' );
$registrationIds = array( $_GET['id'] );
// prep the bundle
$msg = array
(
    'message'   => 'here is a message. message',
    'title'     => 'This is a title. title'
);
$fields = array
(
    'to'            => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE",
    'data'          => $msg
);

$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_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result;

以下是运行此代码时得到的响应:

{ “multicast_id”:5814921248239922706, “成功”:1, “失败”:0, “canonical_ids”:0 “结果”:[{ “MESSAGE_ID”: “0:1476193002715692%a4ddee3cf9fd7ecd”}]}

答案

有两个问题:

  1. 我需要在有效载荷中包含notification部分而不是data
  2. 不知何故,PHP没有正确格式化有效负载。

最后,我使用PHP函数shell_exec()来代替SSH执行cURL请求。这不是理想的,但它完成了工作。

示例代码:

shell_exec('curl -X POST --header "Authorization: key=<key here>" --header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d "{"to":"'.$to.'","priority":"high","notification":{"body": "'.stripslashes($message).'"}}"');
另一答案

从Firebase documentation,您可以选择在消息有效负载中使用数据或通知。但是当您使用数据时,您有责任自己处理通知的接收。换句话说,它不会立即发送到您的应用客户端。您可以在didReceiveRemoteNotification中处理它:对于ios和onMessageReceived(),如果是android

但是,如果您在有效负载中使用通知,则firebase会立即将消息发送到您的客户端应用程序。

这就是为什么即使您的curl请求告诉您它已成功发出请求,您也不会收到消息(如果您使用了数据)。

另一答案

尝试添加{priority:high}

$fields = array
(
    'to'            => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE",
    'data'          => $msg,
    'priority'      =>'high'
);
另一答案

这是我用过的:

<?php
define( 'API_ACCESS_KEY', 'AIzaXXXXXXXXXXXXXXXXXXXXXxaDt14XXXX' );
$msg = array
(
    'body'   => 'msg',
    'title'     => 'title',
    'key1'  => 'val1'
);
$fields = array
(
    'to'            => "ckXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXOTKAo51XkJn27idSbTfXXXXXXXXXXXDAJ0SCZkSViHYXXXXXXXXXXXKHCyPgFBEiXXXXXXXXXXXMu0A6I3iEoI3AXXXXXXXXXXXXXXXXXX",
    'notification'          => $msg

);

$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_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result;
?>

您可以添加示例中的键和值,并在程序中处理它

以上是关于通过cURL / PHP发送时,设备上未收到Firebase通知的主要内容,如果未能解决你的问题,请参考以下文章

PHP - APNs 消息已交付但在 iOS 设备上未收到

从 appery 发送时,iPhone 上未收到推送通知消息

在 android 上未收到 OneSignal 通知,但从 OneSignal 控制台发送

Android GCM 发送成功但在某些设备上未收到

Worklight 6.2:成功发送标签推送通知,但在 android 设备上未收到

设备上未收到 iOS 推送通知