尝试使用带有 TTL 的谷歌 FCM 发送数据

Posted

技术标签:

【中文标题】尝试使用带有 TTL 的谷歌 FCM 发送数据【英文标题】:Trying to send data using google's FCM with TTL 【发布时间】:2018-08-07 18:33:05 【问题描述】:

我一直在尝试通过 Google 的 FCM 发送数据,该 FCM 将在 10 秒后过期。我的意思是,如果用户在这 10 秒内没有连接到互联网,他将不会收到它。

这是我的javascript 代码,用于将请求发送到 FCM:

var http = new XMLHttpRequest();
http.open("POST", "https://fcm.googleapis.com/fcm/send", true);
http.onreadystatechange = function() ;
http.setRequestHeader("Content-type", "application/json");
http.setRequestHeader("Authorization", "key=*****");
http.send(JSON.stringify(
    "to": "/topics/all",
    "data": 
        "Title": "Test",
        "areas": "Dan, Ayalon",
    ,
    "android": 
      "ttl": "10s" //I've tried also removing the s, and changing the ttl to TTL and time_to_leave
    
));

问题是我的 android 应用程序在 2 分钟后仍然收到数据,这 10 秒过去了。 (我在这里所做的是关闭我的手机网络并在 2 分钟后将其重新打开)

我尝试通过 Firebase 控制台发送请求,并且成功了……一分钟后我没有收到消息。我在这里做错了什么?

谢谢!

更新:我想到了另一种解决方案。也许我会手动发送当前时间,然后让客户端检查已经过去了多少时间?这听起来像是一个好的解决方案吗?

更新 2:我尝试了 Google 在他们的文档中提供的每个示例,但没有一个有效。我还尝试了一百万种其他方法来编写请求,但没有任何效果。我开始觉得这可能是一个错误。我举报了 Google,现在我正在等待他们的回复。我会在这里更新他们的回复。

【问题讨论】:

你在哪里执行那个javascript?不是来自您的应用程序,是吗? @kasoban 来自我电脑上的一个随机 html 页面。请求发送得很好,唯一不起作用的是 ttl。 是的,我在想您的请求发送可能会以某种方式被抑制,因为 TTL 应该只在 FCM 服务器收到您的消息时才开始考虑,而不是在您尝试发送它时... @kasoban 我正在立即发送消息,所以我认为情况并非如此。我还尝试等待 2 分钟,但我设置了仅 10 秒的延迟... 【参考方案1】:

所以这是我从 Google 的 Firebase 支持收到的答案,他们在这里发现了我做错了什么:

查看您的代码,您似乎有一些违规行为 您的请求格式。标头用于 Legacy FCM API 而 有效载荷的格式是HTTP v1 FCM API。

如果您想使用旧版 API,则必须省略 Android 特定的有效载荷并使用time_to_live 而不是ttl。但是如果你 更喜欢使用 HTTP v1 API,您必须将请求构建为 提到here 并使用token parameter 而不是to。

问题是我结合了两种请求方法。请求的标头与 Legacy API 的格式匹配,而请求本身是 HTTP v1 FCM API 格式。

这部分请求属于 HTTP v1 API 格式:

"android": 
  "ttl": "10s" 

虽然正确的做法是不使用"android" 标签而只使用time_to_live 标签:

"time_to_live": 10 //The time in seconds

这就是我的完整请求现在的样子:

var http = new XMLHttpRequest();
http.open("POST", "https://fcm.googleapis.com/fcm/send", true);
http.onreadystatechange = function() ;
http.setRequestHeader("Content-type", "application/json");
http.setRequestHeader("Authorization", "key=*****");
http.send(JSON.stringify(
    "to": "/topics/all",
    "data": 
        "Title": "Test",
        "areas": "Dan, Ayalon",
    ,
    "time_to_live": 10
));       

如果有任何问题欢迎评论

【讨论】:

@EmreErdoğan 它应该,看看完整的请求示例,据我所知,它应该适用于所有平台。 注意time_to_live的值应该是Integer【参考方案2】:

我感谢@morha13。你也可以查看this作为一个完整的例子。

【讨论】:

以上是关于尝试使用带有 TTL 的谷歌 FCM 发送数据的主要内容,如果未能解决你的问题,请参考以下文章

使用谷歌日历的谷歌数据 API 创建新活动时向客人发送电子邮件

如何使用 C# 向所有设备发送带有图像的 FCM 通知?

TTL 功能不适用于谷歌浏览器推送通知

介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件

向 FCM 服务器发送 JSON 请求不起作用

使用 php 向 ios 设备发送带有 fcm 令牌的远程通知