2015-04-24 18 views
6

Uygulamamı hizmet çalışanları kullanarak çevrimdışı duruma getirmeyi düşünüyorum. Zaten önbellek kaynakları ile tatmin edici sonuçlar elde ediyorum, ama aynı zamanda internete bağlı olup olmadığımı kontrol etmem gerekiyor, eğer değilse - istekleri saklayın ve onu başlatmayın.

Anlayacağım, gelecekteki onsync bununla yardımcı olacaktır, ama bunun için - hatta geçici - çözüme ihtiyacım var.

Ben sadece işçinin içinde bir dizi isteklerini saklamak için denedim, ama kalıcı değil - (GB çevrimdışı içeriği çalışır ve sunarken) bilgisayar yeniden başlatıldıktan sonra çalışmaz.

İyi yön nedir - önbellek gibi dosyaları bir şekilde saklıyor? Veya IndexedDB/SimpleDB (Accessing indexedDB in ServiceWorker. Race condition) kullanarak? (Bu durumda, HTTP GET aracılığıyla Google Analytics ping) isteklerini belirli türde arızaların tespit ve IndexedDB kullanarak hatalarını sıraya bir hizmet işçisi kullanmanın https://github.com/GoogleChrome/samples/tree/gh-pages/service-worker/offline-analytics de bir örnek varREST isteklerini eşitlemek için hizmet çalışanları ile depolama

+1

Sorununuz nedir çok açık değil. Sorunuz, IndexedDB'nin çevrimdışı depolama için kullanılıp kullanılamayacağıysa, o zaman evet yapabilir. Depolama işlemlerinizi nasıl yapılacağını bilmiyorsanız, hem çevrimiçi hem de çevrimdışı modları desteklemeleri için, burada önerilenleri görebilirsiniz: http://stackoverflow.com/questions/22342836/syncing-indexeddb-with-sql -server – dekkard

+0

Teşekkürler ama ben çevrimdışı olacağım zaman onları senkronize etmek için çevrimdışı olduğumda Hizmet İşçi içinde POST istekleri depolamak için bir yol arıyorum. IndexedDB'de saklamak bir yanıt olabilir, ancak IndexedDB [Cordova Plugin] tarafından desteklenmez (https://github.com/MobileChromeApps/cordova-plugin-service-worker/blob/master/README.md) ve Hizmet Çalışanlarını şimdi iOS'ta kullanmanın tek yolu. –

cevap

19

. Sıra, hizmet çalışanı her başlatıldığında incelenir ve istek başarılı bir şekilde "yeniden oynatılabilir" (ağ kullanılabilir olduğu için) olduğunda, sıradan kaldırılır. Bir hizmet çalışanının ne zaman başlayacağı konusunda herhangi bir garanti olmamakla birlikte (arka planda senkronizasyon etkinlikleri gelecekte de yardımcı olacaktır), eğer bir kullanıcı aktif olarak web uygulamanızı kullanıyorsa, servis görevlisi kendini yeniden canlandırabileceğini garanti edebilir.

Bu

HTTP POST s gibi isteklerin diğer türleri jeneralize olabilir, ancak düşünmek için bir kaç şey vardır:

  • onların HTTP POST sıraya edildiğini kullanıcıların farkında olduğundan emin olun ve irade tekrar oynatılmak. HTTP POST s normalde sunucu tarafı durumunu değiştirdiğinden, X saatin yeniden düzenlenmiş isteğinin sonucu olarak bir şey değiştiğinde kullanıcıları şaşırtmak istemezsiniz.
  • aradığınız hangi hizmeti bağlı olarak, HTTP POST s geçerli Authorization başlık gerektirebilir. Yetkilendirme için OAuth 2 kullanıyorsanız, sınırlı bir kullanım ömrüne sahip erişim belirteçleri kullanabilir. Önceden geçerli bir Yetkilendirme belirtecinin, isteği yeniden gönderdiğiniz sürenin süresi dolmuş olabilir.
  • , isteklerinizi sıraya koymak için iyi bir seçenektir, çünkü isteğe bağlı verilerin depolanmasında esneklik sağlar ve örneğin HTTP POST'un gövdesini çok çalışmaksızın depolamak mümkün olmalıdır. IndexedDB'u kullanamıyorsanız (Cordova'u kullanarak desteklenmiyorsa), düşünebildiğim tek diğer seçenek,s ile başarısız olan yeni bir "sıra" önbelleği oluşturmak için Cache Storage API'u kullanmayı denemek olacaktır. Anahtarlar ve değerler olarak boş Response nesneleri. Hizmet çalışanı başlangıcında, tüm Requests öğelerinin listesini almak için "sıra" önbelleğindeki keys() yöntemini kullanabilir ve her için, yeniden oynatmak için fetch(queuedRequest) numaralı telefonu arayın. Bu yaklaşımı daha önce denemedim, ama işe yarayacağını düşünüyorum.
+1

Mükemmel cevap, teşekkürler Jeff! –

+0

Herkes, HTTP POST'un gövdesinin IndexedDB'ye nasıl depolanacağı ve daha sonra nasıl alınacağı hakkında bir örnek verebilir mi? – alearg