Я не уверен, как правильно обрабатывать разные учетные записи пользователей на одном устройстве, поскольку Firebase создает только один Instance-Id для каждого устройства.
Поэтому я подумал, что было бы возможно удалить Instance-Id, когда пользователь вышел из системы, и создать новый, когда новый пользователь вошел в систему.
При входе в систему:
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(task -> System.out.println(task.getResult().getToken()));
На выходе:
FirebaseInstanceId.getInstance().deleteInstanceId()
Гарантирует ли Firebase, что Instance-Id будет уникальным, даже если он генерируется несколько раз на одном устройстве? Причины, по которым я предпочитаю такой подход, заключаются в том, что он просто отменяет подписку на пользователя сразу по всем темам, и, кроме того, push-уведомления могут быть адресованы конкретному пользователю.
Гарантирует ли Firebase, что Instance-Id будет уникальным, даже если он генерируется несколько раз на одном устройстве?
Регенерация идентификатора экземпляра действительно всегда приводит к уникальному значению. Если вы гарантируете, что удаляете идентификатор экземпляра при выходе пользователя из системы, в следующий раз вы получите новый токен.
Чтобы реестр токенов (место хранения токенов) не накапливало слишком много устаревших токенов, обязательно удалите токен, когда пользователь выходит из системы, или когда вы обнаружите, что токен больше не действителен при отправке сообщений. Смотрите мой ответ на этот вопрос.
создать объект firebaseuser: -
private FirebaseUser firebaseUser;
String userId = firebaseUser.getUid();
Лучший способ решить вашу проблему - это использовать topic
сообщений.
Из документов:
Основываясь на модели публикации/подписки, обмен сообщениями по темам FCM позволяет отправлять сообщения нескольким устройствам, которые выбрали определенную тему. По мере необходимости вы создаете тематические сообщения, а FCM обеспечивает надежную маршрутизацию и доставку сообщений на нужные устройства.
Когда пользователь входит в приложение, вы можете подписаться на определенную тему, например:
FirebaseMessaging.getInstance().subscribeToTopic("weather")
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
String msg = getString(R.string.msg_subscribed);
if (!task.isSuccessful()) {
msg = getString(R.string.msg_subscribe_failed);
}
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
Затем пользователь может получать уведомления на основе названия темы. Затем, когда пользователь нажимает кнопку выхода из системы, вы можете вызвать следующее:
FirebaseMessaging.getInstance().unsubscribeFromTopic("weather");