通过cURL/PHP发送的Firebase通知在设备上未收到

10

我有一个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,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1476193002715692%a4ddee3cf9fd7ecd"}]}


是的。该应用程序已成功转换为Swift 2.3。当从Firebase控制台发送通知时,它们会被成功传递。 - Robbie Lewis
@FredLoh 我正在真实的 iPhone 7 和 iPod touch 上进行测试。 - Robbie Lewis
3
好的,我发现应该使用notification而不是data。我想做的就是在我的iOS应用程序中引发一个标准的推送通知消息,与从Firebase管理界面发送通知时出现的消息完全相同。另外,我应该使用body而不是 content 来设置消息内容。尽管如此,我的代码仍然无法工作。这是我的有效载荷:{"to":"cUxd-iTVVWo:APA...","notification":{"body":"here is a message. message","title":"This is a title. title"}} - Robbie Lewis
1
就像 @AL 建议的那样,您需要将 priority:high 作为“to”字段的兄弟节点包含进去。请注意,只有在需要用户交互时才应使用高优先级。 - Arthur Thompson
我遇到了同样的问题... 顺便说一下,Firebase控制台似乎只显示通过控制台发送的通知,而不是通过REST API请求发送的通知。 - bluenowhere
显示剩余9条评论
4个回答

10

有两个问题:

  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).'\"}}"');

2
哇,谢谢伙计!我和我的团队成员一直在搞很多事情,谢谢你的帮助!(Y) - Pratik Jamariya
我已经尝试使用CURL和SHELL运行上述两个代码,但设备仍未收到消息。检查响应:{"multicast_id":86505386437********,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1496139295510837%32c366ea********"}]} - Mahesh Cheliya
在您的字段部分中添加通知部分。 - Tejas Khutale
我也遇到了同样的问题,请问您能分享一下示例代码吗?先行致谢! - NACHIMUTHU RAMALINGAM

6
根据 Firebase 文档,在消息有效负载中可以选择使用数据(data)或通知(notification)。但是当您使用数据时,您有责任自己处理通知的接收。换句话说,通知不会立即发送到您的应用程序客户端,而是需要在iosdidReceiveRemoteNotification:和在AndroidonMessageReceived()中进行处理。
然而,如果在有效负载中使用通知,Firebase将立即将消息发送到您的客户端应用程序。
这就是为什么即使您的curl请求告诉您已成功发出请求,但如果您使用数据,您也将无法收到消息的原因。

我使用了@Robbie Lewis的答案,并将数据替换为通知...然后完成。 - iman kazemayni

1
尝试添加 { priority : high }
$fields = array
(
    'to'            => "cUxd-iTVVWo:APA*****kQTuqJ5RREKhhlJjm27NCuVfUn5APg3lBFqh-YWjgx*****iOpAQeLB14CzM2YTwIJo_75jzCmbFLKj0_zpKSHvAEbmJz*****BBezGJIng-N4H-cAD6ahY7mQNYZtEJLAIE",
    'data'          => $msg,
    'priority'      =>'high'
);

0

这是我使用的:

<?php

//服务器密钥现在是必需的,因为旧有密钥已不可用

define( 'API_ACCESS_KEY', 'AAAA9....sQ:APA..HKb_Qfz.....q_k4NJonXd...9r-Fof....dJ_ylYLbR....NFz-uQRve.....0GoNISAA......SKx8G_4M...n' );
$messsage = array
(
    'body'   => 'msg',
    'title'     => 'title',
    'key1'  => 'val1'
);
$fields = array
(
    'to'            => "MdS.....Jg:APA91bEhZ........wkZ7rVmt6UmTc4T189M6ie39COvVmqsIA2DEijt_o9lHUGZbSFez......rPqNo4W_Ru............BEGEo6cuWOKu2vasQju",
    'notification'          => $message

);

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

你可以像示例一样添加键和值,并在程序中处理它。


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