Фоновая синхронизация c в Service Worker не работает в chrome на android - PullRequest
5 голосов
/ 11 января 2020

Я добавил PWA в приложение angular.

Ниже приведен код внутри сервисного работника, который прослушивает событие syn c. Как только сервисный работник обнаруживает соединение inte rnet, он запускает это событие syn c.

self.addEventListener('sync', function (event) {
 console.log('syncing started.');
event.waitUntil(getAllrecordsAndPost());
});

В компоненте:

Syn c регистрация события:

navigator.serviceWorker.ready.then(function(swRegistration) {
      return swRegistration.sync.register('myFirstSync');
    });

Это нормально работает в chrome на рабочем столе, но в android chrome событие background syn c не работает.

К вашему сведению: я использую последнюю версию chrome версия (79).

РЕДАКТИРОВАТЬ:

После дальнейшего изучения я обнаружил, что событие syn c запускается, но внутри этого события syn c a написан код для fetch, который выдает ошибку, и поэтому фоновая синхронизация c не работает. ниже приведен код, который прослушивает событие syn c и запускает API.

 (function () {
        'use strict';

        self.addEventListener('sync', function (event) {
        event.waitUntil(postUrl());
        });

        function postUrl() {
            let url = 'http://mytesturl.com/testAPI';
            let data = {name:'test',age:10};
            fetch(url, {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: data
            }).then((result)=>{
                console.log('successful');
            }).catch((x)=>{
                console.log('error ' + x);
            })
        }
     }());

В консоли я получаю сообщение об ошибке: error TypeError: Failed to fetch

Ответы [ 2 ]

2 голосов
/ 14 января 2020

https://web.dev/periodic-background-sync/ указывает, что фоновая синхронизация c работает только из PWA, «установленного» и запускаемого как отдельное приложение (а не как вкладка в браузере) - можете ли вы уточнить, пытались ли вы запустить его в этих условиях?

1 голос
/ 16 января 2020

Фоновая синхронизация c работника службы запускается, как только он обнаружил соединение inte rnet.

Следовательно, все, что находится внутри события syn c, также будет выполнено (отправлять запросы) немедленно. Независимо от стабильности соединения inte rnet, поэтому, чтобы избежать этого, я добавил тайм-аут в 3 секунды. теперь он работает как положено.

Syn c прослушиватель событий внутри сервисного работника:

 self.addEventListener('sync', function (event) {
    event.waitUntil(setTimeout(function(){getAllrecordsAndPost()},3000));
    });
...