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':无}
从文档中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)
| 归档时间: |
|
| 查看次数: |
858 次 |
| 最近记录: |