2013-07-10 13 views
14

Geçen ay için oldukça karmaşık bir HTML5 web uygulaması geliştirmekteyim. Dün gece iPhone aniden tüm JS, CSS ve görüntüleri önbelleğe almaya karar verdi ve güncellenmiş kopyaları yüklemedi. Bu, eşimin iPhone numaralı telefonunda da oldu. Bu yüzden, uygulamanızın tüm kullanıcılarını etkilediğini varsayacağım.iOS Web App - overcealous uygulaması önbellekleme ile nasıl başa?

İnternet bağlantısının silinmesi, web uygulamasının silinmesi, telefonun yeniden başlatılması, kablosuz bağlantıyı yeniden başlatmanın & sorununun giderilmesi için hiçbir şey yapmadığını söylemeye gerek yok.

<meta name="apple-mobile-web-app-capable" content="yes">'un kaldırılması sorunu çözüyor, ancak uygulamanın bir uygulama gibi çalışması için gerektiğinden yeni bir sorun oluşturuyor.

Tüm skriptlerimizin, stil sayfalarımızın ve resimlerin sonuna, eski trick ?number ekleyemeyiz. Saçma. Ayrıca - 'un böyle bir şeyi uygulamak için olsaydı, bir çeşit dinamik JS uygulaması olması gerekirdi. Bizim app çoğu betikleri yükleyen bir HTML sayfası ve ek sayfaları AJAXed, ek veri de AJAX ile elde edilir. Sanırım bu yapılabilirdi, ama daha zarif bir çözüm bulmayı umuyorum. Biliyorum, bu yüzden tüm bir ay boyunca bir aksama olmadan çalıştı bir şey yapmak zorunda olmamalı gibi hissediyorum.

bu tamamen bir iOS web uygulaması sorunudur olarak, ya bize bir faydası yapmaz cache-control, expires ve pragma<meta> etiketleri kullanma. Önbelleğe alma, normalde mobil Safari, mobil Chrome ve tüm masaüstü tarayıcılarında çalışır. IOS'un, kullanıcı tarafından temizlenemediği web uygulamaları da dahil olmak üzere uygulamalar için ayrı bir önbelleği olduğu anlaşılıyor.

Birçok SO kullanıcısı bu sorunla karşılaştı gibi görünüyor, ancak tatmin edici çözümler bulamıyorum. Benzer bir durumda herhangi biri bu sorunu çözdü mü? Birkaç dosyayı önbelleğe almak için belirtmek için bir bildirim dosyası kullanabilir miyim? Görünmez dosyalar tersini yapmak için kullanılıyor gibi görünüyor.

+2

, iOS7'de hala (büyük) bir sorun olduğunu doğruladı –

+0

[HTML Uygulama Önbelleği] kullanıyor musunuz (http://www.html5rocks.com/en/tutorials/appcache/beginner/)? Aksi takdirde, iOS web uygulaması önbelleğini, güncellenmesi gereken dosyalarla birlikte bir appcache manifest dosyası oluşturarak önbelleğe dökülmesini 'kandırabilirsiniz'. Daha sonra değişiklik yapmanız ve değişiklikleri test etmeniz gerektiğinde, web sunucunuzdaki manifest dosyasının adını değiştirerek bildirimi devre dışı bırakın. Bu, depodaki bildirim ve önbelleğe alınmış dosyaları geçersiz kılar çünkü sunucudaki bildirim bulunamadı. – BigMacAttack

+0

Uygulama Önbelleği kullanılmıyor veya bildirim kullanılmıyor. Web uygulaması 'üretim' ortamında kullanılır. Mevcut bir kurulumda sistemimizin bir güncellemesini yapmak ve önbelleği kandırmak için bir dosya adını değiştirmek mümkün değildir. Geliştirme ortamımda, test için dosya adına kolayca bir sayı ekleyebilirim, ancak OP'nin dediği gibi, üretim ortamında –

cevap

6

Değeri için, ve bu mükemmel bir çözüm değil, sorgu dizeleri ekleyerek yerleşmek zorunda kaldık. Bunu yapmak için bir kabuk komut dosyası yazdım ve birkaç tane daha otomatikleştirilmiş diğer görevler, kaynağa GitHub'dan bakabilirsiniz. Birkaç ayrıntıları:

  • O JS için tasarlanmış ama kolayca çok CSS işlemek için düzenlenebilir. iPhone 25kb öncesi gzip aşacak herhangi önbelleğe ne zaman (mümkünse görünüşte bu sadece tarayıcılar ve değil uzanır rağmen, 25KB altında Google'ın Kapatma Derleyici ile parçalara ayrılmasına
  • Gruplar bunları bunları script_order.txt listelenen tüm dosyaları alır ve derler
  • bağımsız webapps)
  • Kod dosya adlarına eklenmiş olan ?v=timestamp numaralı <script> etiketli bir PHP dosyasını çıktılar. Statik HTML ile çalışıyorsanız ve bir PHP dosyası ekleyemiyorsanız, komut dosyalarını etiketlerinize index.html dosyanıza eklemek için çıktıyı yeniden yazabilirsiniz.

Başka oldukça hacky çözüm .php dosya uzantısı ile JS/CSS kurtarmak için hazırlayın ve bu dosyalarda böyle bir şey için başlıkları ayarlarsınız:

<?php 
header("content-type: application/javascript"); 
header('Cache-Control: no-cache'); 
header('Pragma: no-cache'); 
?> 
window.alert('hello world'); 

DÜZENLEME:

Tarihi 2, 3 veya 4 gün olarak ayarlayarak, uygulamayı ana ekrandan başlatın ve ardından tarihi normale döndürün, ayrıca hile de yapabilirsiniz.

+0

Cevabınızın sorunuzla ilgisi olduğundan emin misiniz? OP için bilmiyorum ama bir PHP web sunucusuna sahip değilim. Zaman damgaları javascript kullanarak dosya isimlerine kolayca eklenebilir. Soru açıkça şöyle diyor: “Eski numarayı ekleyerek etrafa doya doya doya doya doyamayız, tüm scriptlerimizin, stil sayfalarımızın ve resimlerimizin sonuna kadar. Bu çok saçma. ' –

+1

@ bart-s I _am_ OP. Dediğim gibi, istemediğim halde sorgu dizisine yerleşmek zorunda kaldık. Elbette, JS ile zaman damgaları eklemek kolaydır, ancak bir kabuk betiği, en azından dev sistemleri ve aşamalandırma/üretim ortamlarında kurulum sürecini otomatikleştirmeye yardımcı olabilir. PHP burada gerekli değildir. Ondan faydalı parçaları seçebilmeniz için çözümümün dışına atıyorum, ama durum böyle değildi. İnan bana, acını hissediyorum. –

+2

OP olduğunuzu görmemeliydim. Önbellek gülünç. Tarayıcıda her şey yolunda gidilebilse bile, ana ekrana kaydetme işlemi önbelleğe alınmaya devam edecektir. Gelecek için tarihi belirleyen başka bir numara buldum. Cevabınızı ekledim bana cevap vermek için -1 –

İlgili konular