34 votes

Application Web Mobile de ne pas effacer la mémoire cache correctement

J'ai été le développement d'une application web mobile pour iPad et j'ai été en cours d'exécution dans un problème pour tester mon code.

De temps en temps, apparemment au hasard, l'iPad s'arrêter correctement la mise à jour de toutes les bibliothèques JS que j'ai écrit. Après la mise à jour du code et, en affichant les changements, je vais l'avis de certains fichiers ont été correctement mise à jour alors que d'autres n'ont pas. Ce comportement persiste après de nombreuses cache efface, cycles de puissance, et le wifi permet de basculer.

Si je charge l'application dans safari je n'ai pas de problèmes avec elle, mais lorsque je charge à partir de l'app de l'écran d'accueil icône du problème s'affiche de nouveau. J'ai fait des tests simples comme l'ajout d'une ligne d'alerte dans une bibliothèque et que l'alerte se déclenche sans problème n'importe où sauf dans le mobile-web-app de la fenêtre. Ensuite, apparemment au hasard, encore une fois, le problème disparaît, parfois, cela prend 5 minutes, parfois une heure.

Je vois ce comportement que l'application est à l'aide d'un fichier de manifeste ou pas. J'ai aussi essayé de vider ces fichiers existants par la mise à jour du fichier de manifeste de la force de la remettez en cache de cette façon, mais le problème persiste encore.

Personne ne sait si c'est un problème connu avec l'iPad? Est-il rien sur ma fin, qui peut être fait pour remédier à cela?

11voto

Ludovic Points 111

Pour moi, la solution est d'ajouter ?v=1 à la fin de tous vos Javascript et CSS des liens. J'ai tout essayé avant de voir que sur un autre Stackoverflow poste et il a travaillé directement !!! Il était temps...

8voto

bench-o Points 295

J'ai la solution!

Mais d'abord le problème: l'iPad et l'iPhone n'est pas l'actualisation de la mémoire cache lors de l'ouverture de l'application. Même la suppression de l'application, de la compensation safari cache, le redémarrage de l'appareil, etc. etc. ne marche pas.

Et voici la solution ... taadaa !

Votre manifeste-fichier DOIT changer. Si elle est modifiée, iPad/iPhone recharger le cache. Donc, il suffit d'écrire un numéro de version dans votre fichier manifeste et le changer quand vous avez changé quelque chose:

# Version: 1.2

Donc le fichier de manifeste pourrait ressembler à ceci:

CACHE MANIFEST

# Version 1.5

NETWORK:
*

CACHE:
index.html
jquery-1.7.2.min.js
images/logo.jpg

Il a même la recharge des choses comme des images qui ne sont pas écrites dans le fichier de manifeste. Je l'ai testé plusieurs fois.

Btw. n'oubliez pas de consulter votre manifeste fichier avec les http://manifest-validator.com

Ma source, c'est cette très cool comment en mode hors connexion d'applications web: http://gregsramblings.com/2012/05/28/html5-application-cache-how-to/

Il dit aussi que vous avez peut-être besoin pour démarrer votre application deux fois:

Si le manifeste a été mis à jour, le navigateur va télécharger tous les fichiers dans le fichier mis en cache liste, MAIS, le contenu d'origine ont déjà chargé dans ce point (rappelons que c'est déjà dans le cache, donc il charge super rapide!).

Mais il a travaillé pour moi toujours sur la première tentative.

6voto

John Wolf Points 1

Le travail autour de ce problème. Ajouter un lien vers l'Application Web elle-même comme...

<a href="javascript:top.frames.location.reload();">refresh</a>

Il fonctionne comme le bouton de rechargement de l'iPhone/iPad barre d'adresse de Safari!

2voto

Jezen Thomas Points 6311

J'ai passé plusieurs heures à essayer de résoudre ce problème, et il semble que le fichier manifest qui est censé gérer la mise en cache des fichiers, peut lui-même être mis en cache, en laissant votre web-app dans les limbes.

Dans mon cas, je ne voulais pas quelque chose de mis en cache. Voici comment j'ai résolu le problème:

  • Activer le mod_expires module Apache sur mon serveur
  • Créer un .htaccess le fichier dans le même répertoire que le fichier d'index. Le fichier doit contenir la ligne ExpiresDefault A1.

Cela indique au serveur que chaque fichier doit expirer une seconde après il a été accédé. My web-app est utilisé comme un sondage auprès d'étudiants de conventions, de sorte qu'une seule personne est en l'utilisant à la fois. Ma solution fonctionne pour moi; vous devrez peut-être ajuster davantage si cela vous convient.

Dans le passé, ce problème avait présenté lui-même apparemment au hasard. Tous mes derniers tests ont montré de répondre que l'on pourrait attendre.

1voto

Neo Points 354

J'ai exactement le même problème avec mes applications web sur iPad - parfois, au hasard, la web application de fonctionner en mode autonome ne serait pas actualiser une ressource particulière (HTML/CSS/JS), en dépit de tuer tous les possibles de l'app, la compensation Safari cache et l'histoire, le redémarrage de l'ordinateur, le redémarrage d'internet-wifi, l'actualisation ou la suppression de l' manifest le fichier ou le fait de mettre l'appareil dans un four à micro-ondes; de même, l'application d'un marteau de forgeron s'est avéré être futile.

Alors que je n'ai pas trouvé de "casher" moyen pour résoudre ce problème, il existe toujours une solution de contournement - renommer la ressource.

Il suffit de modifier le nom de la non-rafraîchissant fichier. Si vous avez un problème avec, disons, foobar.js pas de mise à jour, de le renommer en foobar2.js et mettre à jour les références à cette ressource dans d'autres fichiers. Bien sûr, cela pourrait être une douleur dans vous savez quoi (surtout quand au bout d'une semaine de développement, vous êtes en foobar12.js), mais jusqu'à ce que nous voyons d'un correctif officiel pour iOS ou un travail rafraîchissante technique, c'est le seul moyen que je connaisse pour se lever et courir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X