FirebaseInstanceId.getInstance()。getToken()生成两种不同类型的令牌

时间:2016-08-28 19:54:44

标签: android firebase push-notification firebase-cloud-messaging

我正在使用以下代码生成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. 在FCM中,140个字符的标记是否正常?还是不寻常?
  2. 如果是正常的,为什么它无法捕获推送通知? (对于具有152个字符的令牌,绝对没有问题)
  3. 如果140是令牌的异常大小,我可以做什么来产生152 每个装置的尺寸?
  4. 您可以查看我正在使用的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;
        }
    }
    

3 个答案:

答案 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文档。