Я использую 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(), равна 163. Длина маркера, полученная при устаревшем вызове, равна 163 (идеально, но устарело). Длина токена, полученная в FirebaseInstallations, составляет 316.
Мой API Firebase на стороне сервера не может отправить уведомление с использованием кода длиной 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], 'успех': 0, 'неудача': 1, 'canonical_ids': 0, 'результаты': [{'ошибка': 'InvalidRegistration'}], 'topic_message_id': нет}
Из документации для FirebaseInstanceId
:
Этот класс устарел. Идентификатор экземпляра Firebase был заменен на FirebaseInstallations для идентификаторов экземпляров приложений и FirebaseMessaging.getToken() для токенов регистрации FCM.
Похоже, вам нужен FirebaseMessaging.getToken()
, а не FirebaseInstallations.getInstance().getToken(true)
, поскольку вам нужен регистрационный токен FCM.
Эти API предоставляют разные токены для разных целей.
Итак, в вашем примере это будет:
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override public void onComplete(@NonNull Task<String> token) {
}
}
);
Хорошо, это помогло, обновите ответ. FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { String token = task.getResult();}});
Пожалуйста, отредактируйте вопрос, чтобы показать код, который работает не так, как вы ожидаете. В данном случае это будет ваш бэкэнд-код. Не забудьте включить сообщение об ошибке, полученное от API.