我正在使用Firebase云消息传递(FCM),并且每次在客户设备上生成新令牌时,根据下面的代码...我将此新TOKEN发送到我的SERVER DB(云),我按顺序保存它能够使用CFM API将未来的推送通知从服务器发送到设备。
//public class CFMInstanceIDService extends FirebaseInstanceIdService ...
public void onTokenRefresh() {
...
String cfmToken = FirebaseInstanceId.getInstance().getToken();
...
sendRegistrationToServer(customerGuid, cfmToken);
}
通过这样做,我在服务器上有一个客户登录的所有(多个)设备的列表。 (平板电脑,手机,iPhone,Android等)
有没有办法随时验证/验证令牌?
我想知道/确保我与客户关联的所有令牌都属于真实设备。我不想将推送通知发送给不存在的令牌。
答案 0 :(得分:8)
以下是一个示例curl请求,该请求显示如何验证令牌而不必实际发送消息:
curl -H "Content-Type: application/json" -H "Authorization: key=$FCM_API_KEY" https://fcm.googleapis.com/fcm/send -d '{"registration_ids":["$FCMTOKEN"]}'
示例无效响应:
{"multicast_id":7452350602151058088,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}
示例有效回复:
{"multicast_id":9133870199216310277,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1502817580237626%f590ddc2f9fd7ecd"}]}
我从谷歌的火力支持团队那里得到了这个答案。
答案 1 :(得分:6)
不存在这样的事情,您可以从令牌获取的唯一信息是应用信息,而不是它是否有效
https://developers.google.com/instance-id/reference/server#get_information_about_app_instances
你应该做的就是在你发送推送时注意响应,如果密钥不再有效,响应会告诉你应该用NotRegistered
删除哪些密钥
答案 2 :(得分:2)
在发送下游消息之前,无法验证令牌是否仍然有效。您需要做的是在发送消息后检查响应,然后检查响应是否包含任何错误。
例如,如果服务器返回200 + error:NotRegistered
http代码,则表示现有注册令牌可能不再有效。
在“Downstream message error response codes of FGC”部分中,您将找到记录的每个可能的状态响应。
答案 3 :(得分:2)
实际上有一种解决方法,您可以使用dry_run = true
此参数设置为true时,允许开发人员在不实际发送消息的情况下测试请求。
如果用户取消订阅,您会收到NotRegistered
的回复,但实际发送不会被执行
答案 4 :(得分:2)
您可以通过调用
来验证FCM令牌(GET) https://iid.googleapis.com/iid/info/YOUR_APP_TOKEN_HERE
[Header] => 'Authorization: key=YOUR_KEY'
简单易用。
如果令牌有效,则它将以JSON格式返回200个状态代码以及更多详细信息;如果无效,则状态代码将以JSON格式返回400个错误详细信息。