Подтвердить что ты не робот

Может ли Firebase запускать приложение в автономном режиме?

Я подумываю использовать firebase для написания мобильного приложения с помощью PhoneGap и кэша приложений HTML5.

Предположим, что у каждого пользователя есть список элементов TODO. Если приложение запускается, когда телефон находится в автономном режиме, он сможет загружать данные из предыдущего сеанса и синхронизировать, когда соединение установлено? Если это так, мне интересно, как это реализовано, потому что я не мог найти ссылку на localStorage в firebase.js.

4b9b3361

Ответ 1

Короткий ответ: еще нет.

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

Полная автономная поддержка появится в будущем.

edit 2016: теперь доступна полноценная автономная поддержка для родных приложений для iOS и Android: https://www.firebase.com/blog/2015-05-29-announcing-mobile-offline-support.html

Ответ 2

Альтернативой Firebase, которая решает эту проблему для приложений JS, является CouchDb (server) <= > PouchDb (JS-клиент). Если вы реализовали хороший чистый уровень обслуживания на стороне клиента, то перенос на PouchDb должен быть довольно простым, поскольку оба являются базами данных NoSQL/JSON. CouchDb также поддерживает индексированные карты/уменьшает представления.

PouchDb - это Javascript API, который реализует клиент CouchDb полностью автономный. Он может автоматически обнаруживать и использовать локальное хранилище, IndexDb или WebSQL для постоянного сохранения локальных данных в режиме онлайн или офлайн. API PouchDb можно использовать для доступа к вашим локальным или удаленным базам данных (просто измените URL-адрес) и подключите полную синхронизацию или отфильтрованную синхронизацию между ними. Существует множество полезных плагинов PouchDb, образцов кода и небольшой библиотеки оберток для поддержки API-интерфейса AngularJS Q promises.

Используя PouchDb, вы можете безопасно запускать свое приложение во время автономной работы, а затем через несколько дней перезапустить приложение и синхронизировать все ваши изменения данных CUD на сервере. Это может привести к сбоям обновления, поэтому CouchDb поддерживает запись версий, предназначенную для обнаружения и отслеживания этого. Следовательно, для решения этих столкновений вам, вероятно, понадобится логика на стороне сервера. Это неизбежно для распределенных систем с автономной синхронизацией и ключевой особенностью CouchDb. Я не уверен, что Firebase поддерживает эту функцию MVCC.

PouchDb - это в основном повторная реализация Apache CouchDb, включая протокол синхронизации. Оба CouchDb и PouchDb хорошо протестированы, свободны и с открытым исходным кодом. Будучи открытым исходным кодом, сервер CouchDb также может быть развернут как служба интрасети - возможно, синхронизация с внешним облачным сервисом. Существует несколько хостинг-провайдеров CouchDb.

Команда IBM Cloudant хостинга недавно добавила свои функции кластеризации BigCouch в проект Apache CouchDb 2.0, так что теперь вы можете масштабировать от Micro Db (PouchDb) = > Single Server = > Multi-Master (Replicated) = > Big Couch Clustered/Geo Clustered. В отличие от MongoDb, CouchDb безопасно поддерживает развертывание на одном сервере.

ПРИМЕЧАНИЕ. PouchDb также может синхронизировать с CouchBase с использованием того же протокола, но Couchbase! == CouchDb. Это коммерческий продукт.

Другим интересным трюком является то, что PouchDb можно запускать на сервере NodeJS в качестве замены для CouchDb. Я думаю, что он еще не готов к производству, но очень удобен для модульного тестирования. См. express-pouchdb.

Ссылки:

Хозяева CouchDb:

DIY

Докер + CouchDb:

Модель безопасности

Одна проблема, которую вам нужно учитывать при переносе на CouchDb, состоит в том, что она имеет более ограниченную модель управления доступом. Отчасти это связано с его алгоритмом репликации. Это сообщение в блоге подробно описывает это (лучше, чем настоящий окончательный справочник).

Адаптеры

На практике вы, вероятно, захотите использовать WebSQL для своего хранилища PouchDB, поскольку он работает намного лучше. - Здесь полная информация о адаптерах хранения

Дополнительные возможности PouchDb

Там потрясающий массив новых прохладных плюшевых "рождественских елок" всегда выталкивает дверь с открытым исходным кодом из плодовитого сообщества PouchDb.

Одна из лучших возможностей PouchDb - это все открытые исходники плагины (37) и адаптеры интерфейса пользовательского интерфейса (12).

Ответ 3

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

В начале приложения я проверяю, являюсь ли я онлайн navigator.onLine. Если нет, я читаю локальное хранилище и восстанавливаю refb firebase.

export const firebaseFromLocalStorage = (local, storeRef) => {
  // assuming data is array
  const localData = JSON.parse(localStorage.getItem(local)) || []
  localData.map(obj => {
    const key = obj['.key']
    delete obj['.key']
    storeRef
      .child(key)
      .set(obj)
  })
}

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

Конечно, это означает, что localStorage необходимо синхронизировать с вашей базой данных firebase. Я делаю это при каждой операции.

Надеюсь, что это поможет