В настоящее время я изучаю, как использовать фоновую синхронизацию, чтобы пользователи могли вносить изменения PUT / POST при использовании веб-приложения в автономном режиме.
Я выполнил инструкции, данные Джейком Арчибальдом в Знакомство с фоновой синхронизацией , и все работало отлично ... пока я регистрирую фоновую синхронизацию, когда веб-приложение загружалось, находясь в сети. Я имею в виду следующее:
Шаги, которые работают:
- Находясь в сети, я открываю веб-приложение
- Я включаю офлайн-режим на вкладке сети
- Я нажимаю несколько кнопок, которые регистрируют фоновую синхронизацию.
- Я выключаю офлайн-режим, и приложение снова в сети.
- Запускается фоновая синхронизация.
Действия, которые приводят к прекращению работы:
Он полностью перестанет работать даже в описанном выше сценарии, если я сделаю следующее:
- Находясь на другом сайте, я включаю автономный режим на вкладке сети.
- Я перехожу в свое веб-приложение, которое доступно офлайн благодаря работнику службы.
- Я нажимаю несколько кнопок, которые должны регистрировать фоновую синхронизацию.
- Я выключаю офлайн-режим на вкладке сети.
- Ничего не произошло.
- После того, как я перейду на вкладку «Приложение», отменю регистрацию сервисного работника и попробую снова из новой установки, первые шаги работают, но второй набор шагов продолжает нарушать фоновую синхронизацию.
Код:
На странице:
//requesting a one-off sync:
navigator.serviceWorker.ready.then(function (reg) {
return reg.sync.register('sync-tag');
}).catch(function (e) {
console.error(e, "System was unable to register for a sync");
});
В сервисном работнике
self.addEventListener('sync', event => {
if (event.tag == 'sync-tag') {
event.waitUntil( doStuff() )
}
});
Обновлять
Когда код работает, я использовал следующий код для отслеживания тегов, отправленных на регистрацию:
navigator.serviceWorker.ready.then(function (reg) {
console.log('before', reg.sync.getTags());
reg.sync.register('sync-tag');
console.log('after', reg.sync.getTags());
}).catch(function (e) {
console.error(e, "System was unable to register for a sync");
});
При использовании тех шагов, которые работают, я получаю
before: resolved to an empty array
after: resolved to an array with one tag ['sync-tag']
При выполнении действий, которые приводят к прекращению работы:
before: resolved to an array with one tag ['sync-tag']
after: resolved to the same array above
Это наводит меня на мысль, что регистрация синхронизации происходит, но сервис-воркер больше не listening
. И что бы я ни делал, например, закрываю вкладку браузера, обновляю страницу в сети, подождите некоторое время, сервисный работник просто не будет listen
больше синхронизировать события.
Я понимаю, что решать, когда выполнять фоновую синхронизацию, остается за браузером, но я просто не понимаю, почему это не работает. Если не ожидается, что пользователь посетит веб-приложение, находясь в сети, я думаю, что у меня что-то не так.
Благодарим вас за терпение и будем благодарны за любую помощь в понимании того, как заставить работать фоновую синхронизацию.