Как обнаружить отсутствующее сетевое соединение при настройке документа Firestore - PullRequest
0 голосов
/ 19 февраля 2019

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

let newMsgRef = database.document(“/users/\(userId)/messages/\(docId)“)
newMsgRef.setData(payload) { err in
   if let error = err {
       // handle error
   } else {
      // handle OK
   }
}

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

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

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

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

Если бы мы могли уменьшить время ожидания - это могло бы быть хорошим решением - мы бы быстро получили состояние успеха / неудачи, но Firebase не предоставляет такой настройки.

Еще одним вариантом может быть встроенный автономный кэш, я могу рассматривать все записи как успешные и полагаться на механизм синхронизации Firestore, но если приложение было прервано во время автономного режима, сообщение не доставляется.

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

1 Ответ

0 голосов
/ 19 февраля 2019

Обратные вызовы завершения для Firestore вызываются только тогда, когда данные были записаны (или отклонены) на сервере.Нет обратного вызова, когда нет сетевого подключения, так как это считается нормальным условием для Firestore SDK.

Лучший вариант - определить, есть ли другое сетевое подключение, а затем обновитьПользовательский интерфейс соответственно.Некоторые релевантные результаты поиска:

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

Полученные документы имеют свойство metadata.hasPendingWrites, которое указывает, есть ли в документе локальные изменения, которые не были записаны вбэкэнд еще.Вы можете использовать это свойство, чтобы определить источник событий, полученных слушателем снимка:

db.collection("cities").document("SF")
    .addSnapshotListener { documentSnapshot, error in
        guard let document = documentSnapshot else {
            print("Error fetching document: \(error!)")
            return
        }
        let source = document.metadata.hasPendingWrites ? "Local" : "Server"
        print("\(source) data: \(document.data() ?? [:])")
    }

При этом вы также можете правильно отобразить сообщение в пользовательском интерфейсе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...