API 个调用之间的 Firebase 令牌不一致
Firebase Token is inconsistent between API calls
我正在使用 Firebase FCM 从我的服务器向用户发送通知。
当用户第一次安装应用程序时,我在 MessagingService.java:
处捕获了新的令牌
@Override
public void onNewToken(@NonNull String tkn) {
super.onNewToken(tkn);
sendTokenToServer(tkn);
}
问题来了,当用户关闭会话(没有卸载应用程序)时,SharedPreferences 被删除。一个新的会话开始;但是 onNewToken() 没有被调用。因此,我必须手动检索 MainActivity 中的令牌,以便将其发送到服务器。我正在使用这段代码获取更新的令牌:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
sendTokenToServer(instanceIdResult.getToken());
}
});
如您所知,该代码已弃用,应避免使用。相反,我试图用这段代码替换它但没有成功:
FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
@Override
public void onComplete(@NonNull Task<InstallationTokenResult> task) {
if(task.isSuccessful()) {
String token = task.getResult().getToken();
}
}
});
onNewToken()获取的Token长度为163。
在弃用调用中获得的令牌长度为 163(完美,但已弃用)。
在FirebaseInstallations获取的token长度为316.
服务器端的我的 firebase API 无法使用 316 长度的代码发送通知。
任何人都知道我做错了什么?或者为什么我得到那些不同长度的标记?
更新:
服务器端python,从数据库中检索令牌并像这样发送通知。请注意此代码在令牌长度为 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)
尝试发送带有长令牌的通知时,这是我收到的消息:
{'multicast_ids': [8149274412512777031], 'success': 0, 'failure': 1, 'canonical_ids': 0, 'results': [{'error': 'InvalidRegistration'}], 'topic_message_id': None}
来自 FirebaseInstanceId
的文档:
This class is deprecated. Firebase Instance ID has been replaced with
FirebaseInstallations for app instance identifiers and
FirebaseMessaging.getToken() for FCM registration tokens.
看起来您需要 FirebaseMessaging.getToken()
不需要 FirebaseInstallations.getInstance().getToken(true)
因为您需要 FCM 注册令牌。
这些 API 为不同的目的提供不同的令牌。
因此在您的示例中它将是:
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override public void onComplete(@NonNull Task<String> token) {
}
}
);
我正在使用 Firebase FCM 从我的服务器向用户发送通知。
当用户第一次安装应用程序时,我在 MessagingService.java:
处捕获了新的令牌@Override
public void onNewToken(@NonNull String tkn) {
super.onNewToken(tkn);
sendTokenToServer(tkn);
}
问题来了,当用户关闭会话(没有卸载应用程序)时,SharedPreferences 被删除。一个新的会话开始;但是 onNewToken() 没有被调用。因此,我必须手动检索 MainActivity 中的令牌,以便将其发送到服务器。我正在使用这段代码获取更新的令牌:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(MainActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
sendTokenToServer(instanceIdResult.getToken());
}
});
如您所知,该代码已弃用,应避免使用。相反,我试图用这段代码替换它但没有成功:
FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
@Override
public void onComplete(@NonNull Task<InstallationTokenResult> task) {
if(task.isSuccessful()) {
String token = task.getResult().getToken();
}
}
});
onNewToken()获取的Token长度为163。 在弃用调用中获得的令牌长度为 163(完美,但已弃用)。 在FirebaseInstallations获取的token长度为316.
服务器端的我的 firebase API 无法使用 316 长度的代码发送通知。 任何人都知道我做错了什么?或者为什么我得到那些不同长度的标记?
更新:
服务器端python,从数据库中检索令牌并像这样发送通知。请注意此代码在令牌长度为 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)
尝试发送带有长令牌的通知时,这是我收到的消息:
{'multicast_ids': [8149274412512777031], 'success': 0, 'failure': 1, 'canonical_ids': 0, 'results': [{'error': 'InvalidRegistration'}], 'topic_message_id': None}
来自 FirebaseInstanceId
的文档:
This class is deprecated. Firebase Instance ID has been replaced with FirebaseInstallations for app instance identifiers and FirebaseMessaging.getToken() for FCM registration tokens.
看起来您需要 FirebaseMessaging.getToken()
不需要 FirebaseInstallations.getInstance().getToken(true)
因为您需要 FCM 注册令牌。
这些 API 为不同的目的提供不同的令牌。
因此在您的示例中它将是:
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override public void onComplete(@NonNull Task<String> token) {
}
}
);