Firestore не может получить данные после повторного подключения к Интернету

Я использую Firestore с Android SDK (11.6.2), и я получаю исключение, когда мое устройство было в автономном режиме и повторно подключается к Интернету.

При запросе документа происходит сбой в firestore со следующим исключением задачи:

com.google.firebase.firestore.FirebaseFirestoreException: не удалось получить документ, поскольку клиент находится в автономном режиме.

Тем не менее, устройство подключено, я могу делать сетевые запросы рядом с использованием Firestore, и они успешно. Эта ошибка не является постоянной, иногда запрос будет выполнен сразу после повторного подключения к Интернету. Иногда запрос повторяется снова и снова, а затем завершается успешно, иногда более чем через одну минуту после повторного подключения устройства к Интернету.

Вот пример запроса, который создает исключение:

val docRef = firestore.collection("foo").document("bar")
docRef.get().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("FirestoreSourceSet", "Get document success")
    } else {
        Log.e("FirestoreSourceSet", "Get document error", task.exception)
    }
}

Я не использую автономные возможности Firestore, поэтому экземпляр FirebaseFirestore впервые инициализируется с setPersistenceEnabled(false):

val firestoreSettings = FirebaseFirestoreSettings.Builder()
    .setPersistenceEnabled(false)
    .build()

val firestore = FirebaseFirestore.getInstance().apply {
    this.firestoreSettings = firestoreSettings
}

Почему Firestore возвращает эту ошибку, даже если устройство подключено к сети? Я что-то упустил в конфигурации Firestore, чтобы избежать этой ошибки?

Я попытался обновить Firebase до версии 11.8.0, но у меня такое же поведение.

бревна

Это журналы при попытке получить синхронизацию некоторых данных с Firestore (который начинается с выборки документа) после выхода из режима полета: https://pastebin.com/xDMG2Pzj

Сеть уже доступна до первого звонка Firestore, так как я ждал, пока установится Wi-Fi, и проверил его с помощью ConnectivityManager в Android, прежде чем приступить к Firestore.

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

Первая строка журнала - это когда я переключаю режим самолета, который закрывает поток Firestore.

Изменение: выпуск

У Firebase нет общедоступного трекера, но я сообщил о проблеме с помощью их инструмента отчетов и сделал репозиторий, который воспроизводит проблему.

Они признали проблему, но не смогли предоставить ETA, поэтому мы должны подождать:

Если мы выпустим исправление, мы объявим об этом на нашей странице заметок о выпуске.

Это все еще проблема с ядром firestore 17.0.4

Ответ 1

Эта проблема была исправлена в выпуске 17.1.5 Cloud Firestore.

Смотрите официальный журнал изменений https://firebase.google.com/support/release-notes/android

Cloud Firestore теперь быстрее восстанавливается из плохих состояний сети.


При использовании моего репродукционного проекта с версией 18.0.0 проблема действительно отсутствует.

Ответ 2

В официальной документации :

Чтобы использовать автономное сохранение, вам не нужно вносить какие-либо изменения в код, который вы используете для доступа к данным Cloud Firestore. При включенной автономной поддержке клиентская библиотека Cloud Firestore автоматически управляет онлайн-доступом и автономным доступом к данным и синхронизирует локальные данные, когда устройство снова находится в сети.

При инициализации Cloud Firestore вы можете включить или отключить автономное сохранение. Таким образом, при использовании следующей строки кода:

val firestoreSettings = FirebaseFirestoreSettings.Builder()
    .setPersistenceEnabled(false)
    .build()

Фактически вы устанавливаете сохранение на false, вы отключите эту функцию. Чтобы решить эту проблему, просто удалите эту строку кода. По умолчанию Firestore имеет .setPersistenceEnabled(true).