70 votes

Arrêter le rechargement d'une application web lancée depuis l'écran d'accueil de l'iPhone

J'ai créé une application web et l'ai ajoutée à l'écran d'accueil de mon iPhone. Lorsque je passe à une autre application et que je reviens, l'iPhone recharge automatiquement mon application web. Cela casse mon flux d'applications.

Comment empêcher l'iPhone de recharger l'application ?

J'ai activé la métabalise apple-mobile-web-app-capable pour masquer la barre d'outils Safari et je ne veux pas la désactiver.

0 votes

Donc vous n'avez même pas touché à des morceaux de cacao et avez juste enregistré le lien sur votre téléphone ?

3 votes

@Tim Specht : Je ne sais pas où vous voulez en venir, mais le PO demande une application web, pas une application native. Question connexe sur SO : stackoverflow.com/questions/6686654/ - Malheureusement, cette question n'a pas de réponse non plus.

0 votes

Voir ma réponse ici : stackoverflow.com/a/40707231/473637

16voto

René Points 4134

Je viens de trouver cette question connexe sur SO : Empêcher l'application web native de se recharger à l'ouverture sur iOS

Comme il semble que ce soit une limitation de Safari, une solution proposée est de faire persister l'état de vos applications web en utilisant Javascript et HTML5 localStorage. Lorsque votre application web est lancée, elle vérifie l'état persistant et le charge s'il est disponible.

Pour en savoir plus sur l'utilisation de localStorage dans Safari, cliquez ici : http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007256-CH1-SW1

J'espère que cela vous aidera. En tout cas, cela m'a aidé, car j'avais le même problème que vous :-)

4 votes

@Crashalot Le problème persiste à ce jour, et il ne va pas changer avant un certain temps.

1 votes

On dirait que ça ne va pas changer grand-chose. Android, cependant, a récemment ajouté une expérience améliorée des applications web grâce à Chrome, qui met en cache l'état pour vous. Mais c'est une plateforme différente.

2 votes

Miraculeusement, ce problème persiste :O

0voto

Alastair Points 998

La réponse courte est que vous ne pouvez pas contrôler cela. Parfois, iOS maintiendra une application web active en arrière-plan, d'autres fois, il la tuera. Cela dépend entièrement de la quantité de mémoire disponible sur l'appareil.

Ainsi, votre meilleure approche est de minimiser les problèmes présentés par ce rechargement. Assurez-vous que votre application web met à jour l'URL lorsque vous passez d'une vue à l'autre, soit en changeant location.hash ou en utilisant history.pushState() . Cela vous permettra de recharger la vue sur laquelle l'utilisateur se trouvait avant de changer d'application. Il existe pagehide y pageshow événements qui vous permettent d'exécuter du code lorsque l'utilisateur s'éloigne de votre application - profitez-en pour stocker l'état local dans localStorage et/ou IndexedDB, puis récupérez ces données lorsque la webapp est rouverte.

0voto

Artem Bernatskyi Points 513

J'ai trouvé un hack, testé sur iOS 11.4.1/12.0
Ouvrez la fenêtre de téléchargement de fichiers, puis revenez à l'écran d'accueil.
L'application continue de fonctionner, dans mon cas, l'audio est diffusé et localStorage met à jour

Des preuves : https://youtu.be/heehLUhGKYY

PS. Notez comment la progression de la chanson change lorsque nous cherchons, cela prouve que l'application fonctionne en arrière-plan.

0voto

Wilbo Baggins Points 1391

Mise à jour : Comme cette réponse reçoit des votes négatifs, j'ai ajouté cette explication.

Le problème n'est peut-être pas le rechargement proprement dit, mais le fait que Mobile Safari traite le cache et les cookies de l'utilisateur différemment lorsque votre application web est ouverte via le navigateur et lorsqu'elle est "installée" en tant qu'application web sur l'écran d'accueil. Bien que les solutions proposées ici, qui utilisent localStorage, fonctionnent, elles représentent beaucoup de travail pour la logique côté client, ce qui peut être évité si votre serveur est déjà responsable de la persistance de l'état de la session de votre utilisateur. La solution de 30 secondes consiste simplement à définir explicitement le cookie de session pour qu'il ait une durée de vie plus longue.

Cela permet de conserver l'état intact même entre deux redémarrages de l'appareil. Ainsi, même si cela n'empêche pas techniquement le rechargement de l'application Web lorsqu'elle est lancée à partir de l'écran d'accueil, c'est un moyen facile de restaurer l'état pour l'utilisateur sans qu'il s'aperçoive du rechargement - ce qui, dans de nombreux cas, est le véritable problème.


Pour une discussion plus élaborée de cette stratégie et des exemples de code, jetez un coup d'œil à ces questions et à mes réponses :

2 votes

Je crois que le problème ici est légèrement différent. Lorsque vous chargez la page lancée depuis l'écran d'accueil, cela équivaut à cliquer sur un signet qui charge une url, la session n'est pas pertinente. Cela entraîne le rechargement de la page et la perte de l'état, à moins que celui-ci ne soit conservé et chargé d'une autre manière.

0 votes

Bonjour Chris, dans mon cas, cela fonctionne parfaitement. Je n'utilise aucune autre forme de stockage local ou de cache que le cookie de session, et l'état est même restauré lorsque j'éteins et redémarre mon appareil entre-temps. Je n'utilise que l'application Web installée sur l'écran d'accueil. Ma solution ne fonctionne-t-elle pas pour vous ?

1 votes

Non, j'ai le même problème que le PO et j'ai dû mettre en place une solution basée sur le LocalStorage. J'ai utilisé votre solution pour faire persister la session, mais cela ne m'aide pas pour l'état, l'URL marquée est toujours rechargée. Je me demande s'il n'y aurait pas une autre différence ?

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