我一直在尝试通过Google的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分钟后收到数据。 (我在这里做的是关闭我的手机网络并在2分钟后将其关闭)
我尝试通过Firebase控制台发送请求,并且工作正常......我一分钟后没有收到该消息。我在这做错了什么?
谢谢!
更新:我想到了另一个解决方案。也许我会手动发送当前时间,然后我会让客户端检查已经过了多少时间?这听起来像是一个很好的解决方案吗?
更新2 :我尝试了Google在其文档中提供的每个示例,但没有一个能够正常运行。我还尝试了一百万种其他方式来编写请求,但没有任何效果。我开始觉得它可能是一个错误。我报告了Google,现在我正在等待他们的回复。我将在此更新他们的回复。
答案 0 :(得分:10)
所以这是我从Google的Firebase支持中得到的答案,他们发现我在这里做错了什么:
看看你的代码,似乎你有一些不正常之处 您的请求格式。标题是Legacy FCM API的标题 有效载荷的格式适用于HTTP v1 FCM API。
如果您想使用旧版API,则必须省略Android 特定的有效负载并使用time_to_live而不是ttl。但如果你 更喜欢使用HTTP v1 API,您必须构建请求 提到here并使用token parameter代替。
问题是我结合了两种请求方法。请求的标头与Legacy 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
}));
如果您有任何疑问,请发表评论
答案 1 :(得分:0)
我要感谢@ morha13。您还可以查看this作为完整示例。