我一直在尝试通过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应用程序甚至在过去的10秒之后甚至在2分钟后仍会收到数据。(我在这里所做的是关闭网络AY我的手机并在2分钟后将其重新打开(
我试图通过Firebase控制台发送请求,在那里工作...一分钟后我没有收到该消息。我在这里做错了什么?
谢谢!
update :我考虑了另一个解决方案。也许我会手动发送当前时间,然后让客户检查已经过去了多少时间?听起来像是一个不错的解决方案吗?
更新2 :我尝试了Google在其文档中提供的每个示例,但它们都无法使用。我还尝试了其他一百万个编写请求的方法,但没有任何效果。我开始觉得这可能是一个错误。我报告了Google,现在正在等待他们的回应。我将在这里更新他们的回复。
,所以这是我从Google Firebase支持中收到的答案,他们在这里发现了我做错了什么:
查看您的代码,看来您对 您的请求格式。标题是用于传统的FCM API 有效载荷的格式用于HTTP V1 FCM API。
如果您想使用旧式API,则必须省略Android 特定有效载荷并使用time_to_live而不是TTL。但是如果你 更喜欢使用HTTP V1 API,您必须将请求构建为 这里提到并使用令牌参数而不是。
问题是我结合了两种请求方法。请求的标题匹配旧的API格式,而请求本身则以HTTP V1 FCM API格式。
该请求的这一部分属于HTTP V1 API Fomat:
"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
}));
如果您有任何疑问,请评论
我对 @morha13表示赞赏。您也可以将其作为一个完整的示例。