Firebase 令牌在 API 调用之间不一致

Eze*_*ian 1 android firebase firebase-cloud-messaging

我正在使用 Firebase FCM 将通知从我的服务器发送给用户。

当用户第一次安装应用程序时,我在MessagingService.java中捕获了新鲜的令牌:

@Override
public void onNewToken(@NonNull String tkn) {
    super.onNewToken(tkn);
    sendTokenToServer(tkn);
}
Run Code Online (Sandbox Code Playgroud)

问题来了,当用户关闭会话(不卸载应用程序)时,SharedPreferences 被删除。新的会话开始;但onNewToken()没有被调用。因此,我必须手动检索MainActivity中的令牌才能将其发送到服务器。我正在使用这段代码获取更新的令牌:

FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {
        sendTokenToServer(instanceIdResult.getToken());
    }
});
Run Code Online (Sandbox Code Playgroud)

如您所知,该代码已被弃用,应该避免使用。相反,我尝试用这段代码替换它,但没有成功:

FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if(task.isSuccessful()) {
            String token = task.getResult().getToken();
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

在 onNewToken() 中获得的令牌长度是 163。在已弃用的调用中获得的令牌长度是 163(完美,但已弃用)。在 FirebaseInstallations 中获取的令牌长度为 316。

我在服务器端的 firebase API 无法使用 316 长度的代码发送通知。有人知道我做错了什么吗?或者为什么我会得到那些不同长度的令牌?

更新:

服务器端Python,从数据库检索令牌并发送通知,如下所示。请注意,当 token len 为 163 时,此代码有效。

from pyfcm import FCMNotification
push_service = FCMNotification(api_key=" ... ")
push_service.notify_single_device(registration_id=token, data_message=datamessage, time_to_live=1296000)
Run Code Online (Sandbox Code Playgroud)

当尝试发送带有长令牌的通知时,这是我收到的消息:

{'multicast_ids':[8149274412512777031],'成功':0,'失败':1,'canonical_ids':0,'结果':[{'错误':'InvalidRegistration'}],'topic_message_id':无}

ver*_*as1 6

从文档中FirebaseInstanceId

该类已被弃用。Firebase 实例 ID 已替换为应用实例标识符的 FirebaseInstallations 和 FCM 注册令牌的 FirebaseMessaging.getToken()。

看起来您不需要FirebaseMessaging.getToken() FirebaseInstallations.getInstance().getToken(true)因为您需要 FCM 注册令牌。

这些 API 为不同的目的提供不同的令牌。

所以在你的例子中它将是:

FirebaseMessaging.getInstance()
  .getToken()
  .addOnCompleteListener(new OnCompleteListener<String>() { 
    @Override public void onComplete(@NonNull Task<String> token) { 
    }
  }
 );
Run Code Online (Sandbox Code Playgroud)