Я пытаюсь обновить firebase realtime database с FirebaseMessagingService, но при обновлении с FirebaseMessagingService он не обновляется.
Таким образом, логика заключается в том, что когда пользователь A отправляет сообщение пользователю B (приложение в фоновом режиме), он вызывает FirebaseMessagingService после сохранения сообщения в локальной базе данных, мне нужно обновить статус сообщения на «доставлено», чтобы пользователь A получил уведомление о том, что его сообщение дошло до пользователя B. Пользователь B. получаю уведомления, и я вижу в журналах, что журнал пользователя B был выполнен до установки этого значения, и его прослушиватель никогда не вызывается для успеха или неудачи. Я также перепроверил правильность ссылки на базу данных.
Я попробовал использовать методы setValue и updateChildren, но не смог обновить данные. Я удалил прослушиватель для чистого кода.
1:
DatabaseReference messageRef = databaseReference.child(messageNodeKey);
Map<String, Object> update = new HashMap<>();
update.put("Status", msgstatus);
messageRef.updateChildren(update);
2:
DatabaseReference messageRef = databaseReference.child(messageNodeKey).child("Status");
messageRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Log.d(TAG, "onDataChange: "+snapshot+" "+snapshot.exists());
if (snapshot.exists()) {
messageRef.setValue(msgstatus)
}
}
}
Я могу обновить значение, когда устройство находится на переднем плане, но не когда оно звонит из FirebaseMessagingService. Может ли кто-нибудь помочь мне решить эту проблему.
Обновление: после включения отладки и попытки с помощью setvalue
DatabaseReference messageRef = databaseReference.child(messageNodeKey).child("Status");
messageRef.setValue(msgstatus)
Журнал после включения отладки Firebase
RepoOperation D set: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status
DataOperation D set: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status Delivered
RepoOperation D Aborting transactions for path: /Chat/xxx-aaa/messages/-O5eF3_t0HESRIzjS4HE/Status. Affected:
WM-WorkerWrapper I Worker result SUCCESS for Work [ id=40fbeba3-c39c-49dc-8c09-deda65767395, tags = { com.elaxer.Settings_Fragmets.Notification_WorkManager, Notification } ]
System W Ignoring header X-Firebase-Locale because its value was null.
LocalRequestInterceptor W Error getting App Check token; using placeholder token instead. Error: com.google.firebase.FirebaseException: No AppCheckProvider installed.
2024-09-01 02:34:05.829 FirebaseAuth D Notifying id token listeners about user ( xxx ).
(не тот, кто понижает голос) Скорее всего, Android закроет соединение через несколько минут, когда приложение работает в фоновом режиме. Если вы включите ведение журнала отладки, возможно, вы сможете это подтвердить.
@puf-FrankvanPuffelen Все происходит за 3-4 секунды от получения уведомления до создания последнего журнала перед обновлением базы данных. Тем не менее я установлю журнал отладки для получения дополнительной информации. Я скоро обновлю




Скорее всего, Android закроет соединение через несколько минут, когда приложение работает в фоновом режиме. Из документации :
На Android Firebase автоматически управляет состоянием соединения, чтобы уменьшить пропускную способность и расход заряда батареи. Когда у клиента нет активных прослушивателей, ожидающих операций записи или
onDisconnectи он не отключен явно методомgoOffline, Firebase закрывает соединение через 60 секунд бездействия.
Если вы включите ведение журнала отладки, возможно, вы сможете это подтвердить.
Если это действительно причина, вы можете (обнаружить это состояние соединения и затем) переключить клиент Firebase в автономный режим , а затем в онлайн, чтобы вернуться в подключенное состояние.
Пожалуйста, проверьте обновленный код с новыми журналами Firebase.
Вместо того, чтобы просить меня проверить ваши журналы, имеет ли смысл первая часть моего ответа и может ли она объяснить, что происходит в вашем приложении? Если да, то подтвердили ли результаты журнала, что это так?
извините, но я действительно не понимаю точного значения полученного журнала. Я до сих пор не понимаю, почему я получаю обновленное значение, вот почему
А еще я addOnCompleteListener и addOnFailureListener, но никому не позвонили. Я не использую AppCheckProvider, который также отображается в журнале.
Если ни ваш onComplete, ни onFailed не вызывается, клиент обычно не подключен к сети, что соответствует тому, что я сказал в своем ответе.
goOnline работает, но вызывает другие проблемы, например, обновляет время последней активности пользователя, но мне нужно это выяснить. Главный вопрос решается по телефону goOnline(); . Большое спасибо за вашу помощь.
Голосующий против Не могли бы вы сообщить мне, почему вы голосуете против вопроса?