Я пытаюсь обновить 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();
. Большое спасибо за вашу помощь.
Голосующий против Не могли бы вы сообщить мне, почему вы голосуете против вопроса?