无法使用服务器 API 发送推送通知
Posted
技术标签:
【中文标题】无法使用服务器 API 发送推送通知【英文标题】:Can't send push notifications using the server API 【发布时间】:2016-05-19 19:28:22 【问题描述】:我正在使用新的 Firebase 平台。我正在尝试获取我的应用服务器发送的推送通知并发送到我的 iPhone。
我的设置工作正常,我通过网站上的 Firebase 通知区域手动发送消息,但是当我尝试通过 POST 将消息发送到 https://fcm.googleapis.com/fcm/send 时,我没有收到任何消息传递到设备。
我正在发送以下内容(带有身份验证标头)
"notification":
"title": "Portugal vs. Denmark",
"text": "5 to 1"
,
"to" : "<registration token>"
我收到来自 POST 的 200 响应,正文如下:
"multicast_id": 5511974093763495964,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
"message_id": "0:1463685441784359%3ad254b53ad254b5"
]
如果我尝试通过 Firebase 网站直接发送到此设备,它可以工作,但上面的表单帖子没有。不知道从这里去哪里!
【问题讨论】:
当您手动发送然后使用 Firebase 网站发送时,它们是否都使用相同的 Apple 推送环境?有一个 dev 和一个 prod 环境,检查您通过 Firebase 使用的环境是否与您手动使用的环境相同。 我在文档中没有看到任何地方提到这一点?从站点发送并没有给我一个开发或产品选项,其余的 API 也没有?到目前为止,我只上传了一个 dev apns 证书... 我不熟悉 Firebase,但 Apple push 的基本原理是不变的。 prod 环境与 dev 证书不兼容,反之亦然。Apple 开发环境称为沙箱。它的网址是 ssl://gateway.sandbox.push.apple.com:2195。如果您在使用 Firebase 时验证您使用的是 Apple 沙盒环境。 另外,您如何从设备获取 Apple 推送令牌?它可以而且确实会发生变化,因此每次启动应用程序时都必须检索它。使用过时的推送令牌会导致推送失败。 如果我尝试通过网站向特定令牌发送通知,它就会被传递。如果我尝试通过 API 直接发送它,它就永远不会收到。没有办法指定它是通过 dev 还是 prod apple 服务发送? 【参考方案1】:在 ios 上,priority
字段似乎是强制性的。
"to": "cHPpZ_s14EA:APA91bG56znW...",
"priority": "high",
"notification" :
"body" : "hello!",
"title": "afruz",
"sound": "default"
【讨论】:
绝对荒谬。谢谢! 你用沙盒令牌测试过这个吗? 对我来说,它只适用于“高”优先级。 “正常”从未交付。 我也遇到了同样的问题。如果我使用仪表板,则推送已交付,但无法通过 API 工作。我正在使用开发推送证书。 我不应该说“也谢谢我”,但是……谢谢。这确实需要在文档中。【参考方案2】:如果 API 向您返回 message_id
,则表示您的消息已被正确接受,并且最终将传送到设备。
在 android 上,消息会尽快传递(当然前提是设备已连接)。
在 Apple 设备上,如果应用程序已关闭或处于后台,则通知将通过 Apple 基础架构发送,并可通过 Apple 文档相应延迟。
要减少发送到 Apple 设备的优先消息的延迟,您可以使用 priority
参数。
更多详情:https://firebase.google.com/docs/cloud-messaging/concept-options#setting-the-priority-of-a-message
【讨论】:
高优先级有帮助!谢谢。【参考方案3】:我发现message
字段是必需的,priority
字段是通过 POST 传递消息的。
message
在 Firebase 控制台中不是必需的(并且标记为可选)。
【讨论】:
【参考方案4】:我解决了在没有priority
的情况下在请求正文中添加notification
标记。
这里是一个回顾:
【讨论】:
以上是关于无法使用服务器 API 发送推送通知的主要内容,如果未能解决你的问题,请参考以下文章