Коды фоновой синхронизации не работают автоматически при подключении к Интернету (вкл. Wifi) в PWA - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в PWA и тестирую свой проект PWA с использованием базы данных консоли Firebase.В автономном режиме у меня есть код для сохранения моих данных поста в indexedDB, когда я отправляю свои данные поста позже, когда есть WiFi (онлайн).Он сохранил данные в indexedDB, когда WiFi не обнаружен, но когда я включаю свой WiFi, он не публикует мои данные в режиме реального времени.Когда я отправляю новые данные публикации, когда Wi-Fi включен (онлайн), фоновые коды синхронизации отправляют сохраненные данные из indexedDB с новыми данными в реальном времени.Но я хочу, чтобы мои коды фоновой синхронизации отправлялись автоматически при включении WiFi (после автономного режима).

Вот мой код работника сервиса для фоновой синхронизации:

self.addEventListener('sync', function(event) {
  console.log('Background syncing...', event);
  if (event.tag === 'sync-new-posts') {
    console.log('Syncing new Posts...');
    event.waitUntil(
      readAllData('sync-posts') // function to read all saved data which had been saved when offline
        .then(function(data) {
          for (var dt of data) {
            fetch('xxx some firebase post url xxx', { // fetching for sending saved data to firebase database
              method: 'POST',
              headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/json'
              },
              body: JSON.stringify({
                id: dt.id,
                title: dt.title,
                content: dt.content
              })
            })
              .then(function(res) {
                console.log('Sent data', res);
                if (res.ok) {
                    res.json()
                        .then(function (resData) {
                            deleteItemFromData('sync-posts', resData .id); // function for deleting saved post data from indexedDB as we donot need after realtime post is saved when online.
                        });
                }
              })
              .catch(function(err) {
                console.log('Error while sending data', err);
              });
          }
        })
    );
  }
});

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

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Проверьте, выключено ли обновление при перезагрузке и полностью ли вы отключены.У меня была такая же проблема, тогда она случайно начала работать, когда обновление при перезагрузке было отключено.Я думаю, что это потому, что он переустанавливает работника службы каждый раз, когда вы обновляете страницу, поэтому вы не находитесь в состоянии, когда служащий службы ожидает синхронизации.Это моя теория в любом случае.Надеюсь, это поможет ...

0 голосов
/ 18 мая 2018

Что вы можете сделать, это проверить, находится ли ваше приложение в сети снова или нет, используя Онлайн и офлайн события .Это хорошо документированный JS API, который также широко поддерживается .

window.addEventListener('load', function() {
  function updateOnlineStatus(event) {
    if (navigator.onLine) {
      // handle online status
      // re-try api calls
      console.log('device is now online');
    } else {
      // handle offline status
      console.log('device is now offline');
    }
  }

  window.addEventListener('online', updateOnlineStatus);
  window.addEventListener('offline', updateOnlineStatus);
});                        

ПРИМЕЧАНИЕ. Он может только определить, подключено ли устройство.НО НЕ МОЖЕТ различать работающее интернет-соединение или просто соединение (например, точка доступа WiFi без фактического интернет-соединения).

Итак, я бы посоветовал вам сделать искусственный вызов API в событии navigator.onLine, просто чтобы проверить, вернулся ли реальный Интернет или нет (это может быть также простое рукопожатие), и как толькоуспешно, вы можете продолжать делать свои обычные вызовы API.

...