2015-04-24 1 views
6

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

Я понимаю, что будущий onsync поможет с этим, но мне нужно - даже временное - решение для этого.

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

Какое хорошее направление - как-то хранить в кеше файлы? Или с помощью IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition)?Хранение запросов REST с сервисными работниками для их синхронизации

+1

Неясно, в чем проблема. Если ваш вопрос заключается в том, может ли IndexedDB использоваться для автономного хранилища, то да, он может. Если вы не знаете, как выполнять операции хранения, чтобы они поддерживали как онлайн, так и оффлайн режимы, вы можете увидеть, что они предложили здесь: http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard

+0

Спасибо, но я ищу способ хранения POST-запросов в Service Worker, когда я в сети, чтобы синхронизировать их, когда я буду в режиме онлайн. Хранение их в IndexedDB может быть ответом, но IndexedDB не поддерживается [Кордовым плагином] (https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md), и это единственный способ использовать сервис-работников сейчас на iOS. –

ответ

19

Там пример на https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics использования работника службы для обнаружения отказов для определенных типов запросов (в данном случае Google Analytics пинги через HTTP GET), и очередь неудачи с помощью IndexedDB. Очередь проверяется каждый раз, когда рабочий сервис запускается, и если запрос может быть успешно «воспроизведен» (поскольку сеть теперь доступна), он удаляется из очереди. Хотя нет гарантий относительно того, когда начнет работать сервис-работник (события фоновой синхронизации помогут с этим в будущем), вы можете с уверенностью предположить, что если кто-то активно использует ваше веб-приложение, работник службы оживит себя.

Это можно обобщить и на другие типы запросов, как HTTP POST с, но есть несколько вещей, чтобы думать:

  • Убедитесь, что пользователи знают, что их HTTP POST ставится в очередь и будет переигрывать. Поскольку HTTP POST обычно изменяет состояние на стороне сервера, вы не хотите удивлять пользователей, когда что-то меняется в результате повторного запроса, который составляет X часов.
  • В зависимости от того, какую услугу вы вызываете, для HTTP POST s может потребоваться допустимый заголовок Authorization. Если вы используете OAuth 2 для авторизации, он может использовать токены доступа, которые имеют ограниченный срок службы. Раньше действующий токен авторизации мог быть истек к моменту повторного воспроизведения запроса.
  • IndexedDB - хороший выбор для очередности ваших запросов, поскольку он обеспечивает гибкость при хранении произвольных данных, и должно быть возможно, например, хранить тело HTTP POST без особых усилий. Если вы не можете использовать IndexedDB (вы говорите, что он не поддерживается с помощью Cordova), то единственным другим вариантом, о котором я мог подумать, было бы попытаться использовать Cache Storage API для создания нового кэша «очереди», с ошибкой Request s, ключи и пустые Response объекты в качестве значений. При запуске сервисного персонала вы можете использовать метод keys() в кеше «очередь», чтобы получить список всех Requests, а для каждого позвоните fetch(queuedRequest), чтобы воспроизвести его. Раньше я не пробовал этот подход, но я думаю, что он должен работать.
+1

Отличный ответ, спасибо Джефф! –

+0

Может ли кто-нибудь предоставить пример того, как сохранить тело HTTP POST в IndexedDB, а затем получить его? – alearg

Смежные вопросы