Zastanawiam się nad przeniesieniem aplikacji do trybu offline przy użyciu pracowników serwisu. Osiągam już satysfakcjonujące wyniki z buforowaniem zasobów, ale muszę też sprawdzić, czy pobierane jest połączenie z Internetem, jeśli nie - przechowuj żądanie i przesyłaj je.
Rozumiem, że przyszły onsync pomoże w tym, ale potrzebuję - nawet tymczasowego - rozwiązania tego problemu.
Próbowałem tylko przechowywać żądania w tablicy w ramach procesu roboczego, ale nie jest trwały - nie działa po ponownym uruchomieniu komputera (podczas gdy SW działa i udostępnia treści offline).
Jaki jest dobry kierunek - jakoś przechowywanie go w plikach pamięci podręcznej? Lub używając IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition)?Przechowywanie żądań REST z pracownikami serwisu w celu zsynchronizowania ich
Odpowiedz
Jest przykładem na https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics korzystania pracownika serwisu, aby wykryć błędy w odniesieniu do niektórych typów żądań (w tym przypadku, pingi Google Analytics za pośrednictwem protokołu HTTP GET
), a w kolejce niepowodzeń przy użyciu IndexedDB
. Kolejka jest sprawdzana za każdym razem, gdy pracownik serwisu uruchamia się i jeśli żądanie może zostać pomyślnie "odtworzone" (ponieważ sieć jest już dostępna), jest ona usuwana z kolejki. Chociaż nie ma gwarancji co do tego, kiedy pracownik serwisu uruchomi się (zdarzenia synchronizacji w tle pomogą w przyszłości), można bezpiecznie założyć, że jeśli ktoś aktywnie korzysta z aplikacji internetowej, pracownik serwisu ożywi się.
to można uogólnić na inne rodzaje wniosków, jak HTTP POST
s, ale jest kilka rzeczy do przemyślenia:
- Upewnij się, że użytkownicy są świadomi, że ich HTTP
POST
są ustawiane w kolejce i będzie powtórzyć. Ponieważ HTTPPOST
zwykle modyfikuje stan po stronie serwera, nie chcesz zaskakiwać użytkowników, gdy coś zmieni się w wyniku powtórnego żądania, które ma X godzin. - W zależności od usługi, do której dzwonisz, HTTP
POST
może wymagać prawidłowego nagłówkaAuthorization
. Jeśli korzystasz z autoryzacji OAuth 2 do autoryzacji, może ona korzystać z tokenów dostępu o ograniczonej żywotności. Poprzednio ważny token autoryzacji może wygasnąć przed ponownym odtworzeniem żądania. IndexedDB
to dobry wybór do kolejkowania żądań, ponieważ zapewnia elastyczność w zapisywaniu dowolnych danych i powinno być możliwe np. Przechowywanie ciała HTTPPOST
bez większego nakładu pracy. Jeśli nie możesz użyćIndexedDB
(mówisz, że nie jest to obsługiwane przy użyciu Cordova), jedyną opcją, o której mógłbym pomyśleć, byłoby skorzystanie z Cache Storage API, aby utworzyć nową pamięć podręczną "kolejki", z błędnymiRequest
s jako klucze i puste obiekty jako wartości. Podczas uruchamiania pracownika serwisowego można użyć metodykeys()
w pamięci podręcznej "kolejki", aby uzyskać listę wszystkichRequests
, a dla każdego numeru wywołaćfetch(queuedRequest)
, aby odtworzyć ją ponownie. Wcześniej nie próbowałem tego podejścia, ale myślę, że powinno działać.
Doskonała odpowiedź, dziękuję Jeff! –
Czy ktokolwiek może podać przykład przechowywania treści indeksu HTTP POST w indeksie IndexDB, a następnie pobrać go? – alearg
Nie jest jasne, jaki jest twój problem. Jeśli masz pytanie, czy IndexedDB może być używane do przechowywania w trybie offline, to tak, może. Jeśli nie wiesz, jak wykonać operacje przechowywania, aby obsługiwały zarówno tryb online, jak i offline, możesz zobaczyć, co zasugerowali tutaj: http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard
Dzięki, ale szukam sposobu przechowywania żądań POST w Service Worker, gdy jestem offline, aby zsynchronizować je, gdy przejdę do trybu online. Przechowywanie ich w IndexedDB może być odpowiedzią, ale IndexedDB nie jest obsługiwany przez [Cordova Plugin] (https://github.com/MobileChromeApps/cordova-plug-service-worker/blob/master/README.md), a jest to jedyny sposób na skorzystanie z Service Workers teraz na iOS. –