GoogleのFCMを介してデータを送信しようとしていますが、10秒後に有効期限が切れます。つまり、ユーザーが10秒間インターネットに接続していなかった場合、ユーザーはインターネットを受信しません。
これは、FCMにリクエストを送信するためのJavascript
コードです。
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コンソールからリクエストを送信しようとしたところ、正常に機能しました... 1分後にメッセージが届きませんでした。ここで何が悪いのですか?
ありがとうございました!
更新:別の解決策について考えました。たぶん、現在の時刻を手動で送信してから、クライアントに経過時間をチェックさせますか?それは良い解決策のように聞こえますか?
pdate 2:Googleがドキュメントで提供しているすべての例を試しましたが、どれも機能しませんでした。私はまた、リクエストを書くために100万の他の方法を試みましたが、何もうまくいきませんでした。バグかもしれない気がします。私はグーグルを報告しました、そして今私は彼らの反応を待っています。ここで彼らの応答を更新します。
これが私がGoogleのFirebaseサポートから受け取った答えです、彼らは私がここで間違ったことを見つけました:
コードを見ると、リクエストの形式に不規則性があるようです。ヘッダーは レガシーFCM API 用ですが、ペイロードの形式は HTTP v1 FCM API 用です。
レガシーAPIを使用する場合は、Android特定のペイロードを省略し、ttlの代わりに time_to_live を使用する必要があります。ただし、HTTP v1を使用する場合APIでは、前述のようにリクエストを作成する必要があります here およびto-の代わりに tokenパラメータ を使用します。
問題は、リクエストの2つの方法を組み合わせたことです。リクエスト自体はHTTP v1 FCM APIフォーマットでしたが、リクエストされたヘッダーはレガシー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
}));
質問があればコメントしてください