Токен Firebase несовместим между вызовами API

Я использую 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': нет}

Пожалуйста, отредактируйте вопрос, чтобы показать код, который работает не так, как вы ожидаете. В данном случае это будет ваш бэкэнд-код. Не забудьте включить сообщение об ошибке, полученное от API.

Doug Stevenson 13.12.2020 00:16
1
1
724
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из документации для 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().addOnCompleteList‌​ener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { String token = task.getResult();}});

Ezequiel Adrian 13.12.2020 00:36

Другие вопросы по теме