尝试使用谷歌的FCM和TTL

时间:2018-02-28 00:19:12

标签: javascript android json firebase firebase-cloud-messaging

我一直在尝试通过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,现在我正在等待他们的回复。我将在此更新他们的回复。

2 个答案:

答案 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作为完整示例。