后台同步代码在PWA中在线(wifi开启)时无法自动工作

时间:2018-05-18 07:02:31

标签: javascript service-worker progressive-web-apps background-sync

我是PWA的新手,并且一直在使用firebase控制台数据库测试我的PWA项目。离线时,我有代码保存我的帖子数据indexedDB当我提交我的帖子数据以便稍后保存WiFi(在线)时。当没有找到WiFi时,它确实将数据保存在indexedDB,但是当我打开WiFi时,它不会实时发布我的数据。当我在wifi(在线)上提交新的帖子数据时,后台同步代码会实时发布来自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 :(得分:0)

您可以使用Online and offline events检查您的应用再次联机的天气状况。这是一个记录良好的JS API,也是widely supported

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热点)。

所以,我建议你在navigator.onLine事件中做一个虚假的API调用只是为了检查实际互联网是否回来的天气(它也可以是简单的握手),一旦成功后,您可以继续进行常规API调用。

答案 1 :(得分:0)

检查重新加载更新是否已关闭并且您是否完全脱机。我遇到了同样的问题,然后当重新加载更新关闭时,它随机开始工作。我认为是因为每次刷新页面时它都会重新安装服务人员,因此您不会处于服务人员正在监听同步的状态。无论如何,这就是我的理论。希望这会有所帮助...