FirebaseInstanceId.getInstance().getToken() 正在生成两种不同类型的令牌
FirebaseInstanceId.getInstance().getToken() is generating two different types of token
我正在使用下面的代码生成 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 方法一起正常工作以捕获推送通知。
问题是:
- 140个字符的token在FCM中是正常的吗?还是不寻常?
- 如果是正常的,为什么收不到推送通知? (152个字符的token绝对没问题)
- 如果 140 是令牌的异常大小,我可以做些什么来生成 152
每个安装的尺寸?
你可以看看我用的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;
}
}
这是一个太长的观察和问题,无法post作为评论。
我在单个设备上进行了测试,并通过清除应用数据或调用 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 个字符的令牌时,它是否具有 Instance ID 和冒号的 12 个字符前缀?
抱歉,我也无法在我这边重现这个问题。此外,根据 Google 关于 best practices for securely using API keys.
的文档,不建议将授权密钥存储在客户端应用程序中
我建议您使用应用服务器进行设备到设备的消息传递,请参阅 sending upstream messages on Android 的 Firebase 文档。
根据每个人的回答,我假设我的应用程序中可能有一些其他服务导致令牌被截断。该应用程序之前配置为 解析推送通知。我删除了与 PPN 相关的所有内容,看起来问题已经解决了!
我正在使用下面的代码生成 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 方法一起正常工作以捕获推送通知。
问题是:
- 140个字符的token在FCM中是正常的吗?还是不寻常?
- 如果是正常的,为什么收不到推送通知? (152个字符的token绝对没问题)
- 如果 140 是令牌的异常大小,我可以做些什么来生成 152 每个安装的尺寸?
你可以看看我用的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;
}
}
这是一个太长的观察和问题,无法post作为评论。
我在单个设备上进行了测试,并通过清除应用数据或调用 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 个字符的令牌时,它是否具有 Instance ID 和冒号的 12 个字符前缀?
抱歉,我也无法在我这边重现这个问题。此外,根据 Google 关于 best practices for securely using API keys.
的文档,不建议将授权密钥存储在客户端应用程序中我建议您使用应用服务器进行设备到设备的消息传递,请参阅 sending upstream messages on Android 的 Firebase 文档。
根据每个人的回答,我假设我的应用程序中可能有一些其他服务导致令牌被截断。该应用程序之前配置为 解析推送通知。我删除了与 PPN 相关的所有内容,看起来问题已经解决了!