我正在使用以下代码生成FCM注册令牌,以实现设备到设备推送通知服务。
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
saveRegistrationToLocalStorage(refreshedToken);
}
代码生成两种不同的令牌。一个有152个字符,另一个有140个字符(尝试过40-50次,生成的令牌有140或152个字符)。令牌用于使用POST方法进行设备到设备推送通知。
140个字符的令牌 - 与firebase控制台一起使用,但不是来自设备的POST方法来捕获推送通知。
包含152个字符的令牌 - 使用firebase控制台和设备的POST方法都能正常工作以捕获推送通知。
问题是:
您可以查看我正在使用的POST方法:
private class sendPushNotification extends AsyncTask<PushNotificationParams, Void, Void> {
@Override
protected Void doInBackground(PushNotificationParams... params) {
String device_token = params[0].device_token;
String notification_body = params[0].notification_body;
String notification_title = params[0].notification_title;
String authKey = "AIzaSy.......Xz4"; // FCM AUTH KEY
String FCMurl = "https://fcm.googleapis.com/fcm/send";
try{
URL url = new URL(FCMurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Authorization","key="+authKey);
conn.setRequestProperty("Content-Type","application/json");
//custom data
Map<String, String> data = new HashMap<String, String>();
data.put("data_1",data_1);
data.put("data_2", data_2);
data.put("data_3", data_3);
data.put("title", notifcation_title); // Notification title
data.put("body", notification_body); // Notification body
JSONObject map_data = new JSONObject(data);
//custom data ends here
JSONObject json = new JSONObject();
json.put("to", device_token.trim());
JSONObject info = new JSONObject();
json.put("data", map_data);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(json.toString());
wr.flush();
conn.getInputStream();
} catch (Exception e){
Log.e("Response","from http push", e);
}
return null;
}
}
答案 0 :(得分:2)
根据每个人的回答,我假设我的应用中可能还有其他服务导致截断的令牌。该应用之前已针对解析推送通知进行了配置。我删除了与PPN相关的所有内容,似乎问题已经消失了!
答案 1 :(得分:0)
这是一个观察和问题太长,无法发表评论。
我在单个设备上进行了测试,并通过清除应用数据或调用FirebaseInstanceId.getInstance().deleteInstanceId()
来触发获取新令牌。收到的令牌总是152个字符。我发现令牌的前12个字符是FirebaseInstanceId.getInstance().getId()
返回的11个字符实例ID,后跟一个':'后跟一个140个字符的字符串。例如:
Instance ID = dL1lPMbSutI (11 chars)
Token = dL1lPMbSutI:APA91xLz52hcPbGg...hhHrh4h_xFr0318k (152 chars total)
当你得到一个140个字符的标记时,它是否有12个字符前缀的Instance ID和冒号?
答案 2 :(得分:0)
对不起,但我也不能在这个问题上复制这个问题。另外,根据Google有关best practices for securely using API keys的文档,不建议将授权密钥存储在客户端应用中。
我建议您使用应用服务器进行设备到设备的消息传递,请参阅sending upstream messages on Android的Firebase文档。