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 方法一起正常工作以捕获推送通知。

问题是:

  1. 140个字符的token在FCM中是正常的吗?还是不寻常?
  2. 如果是正常的,为什么收不到推送通知? (152个字符的token绝对没问题)
  3. 如果 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 相关的所有内容,看起来问题已经解决了!