Beenden Sie das Neuladen der vom iPhone-Startbildschirm aus gestarteten Web-App

70

Ich habe eine Web-App erstellt und meinem iPhone-Startbildschirm hinzugefügt. Wenn ich zu einer anderen App und zurück wechsle, lädt das iPhone meine Web-App automatisch neu. Dies unterbricht meinen App-Flow.

Wie verhindere ich, dass das iPhone die App neu lädt?

Ich habe ein Apple-Mobile-Web-App-fähiges Meta-Tag aktiviert, um die Safari-Symbolleiste auszublenden, und ich möchte es nicht deaktivieren.

Rand
quelle
Sie haben also nicht einmal ein paar Kakaostücke angefasst und nur den Link zu Ihrem Telefon gespeichert?
Tim Specht
3
@ Tim Specht: Ich bin mir nicht sicher, was Sie meinen, aber das OP fragt nach einer Web-App, nicht nach einer nativen App. Verwandte Frage zu SO: stackoverflow.com/questions/6686654/… - Leider hat diese auch keine Antwort.
René
Siehe meine Antwort hier: stackoverflow.com/a/40707231/473637
Jeshurun
Das ist so eine massive Schande :-(
Simon_Weaver
Dieses kleine Reaktionsmodul wurde erstellt, das diese Informationen zum lokalen Speicher beibehält und zur vorherigen Route weiterleitet, wenn die App bereitgestellt wird. Dieses Problem ist noch heute relevant ( github.com/diogofcunha/react-persist-route )
Diogo Cunha

Antworten:

16

Ich habe gerade diese verwandte Frage zu SO gefunden: Verhindern Sie, dass sich die native Web-App beim Öffnen unter iOS neu lädt

Da es sich anscheinend um eine Einschränkung von Safari handelt, besteht eine vorgeschlagene Lösung darin, den Status Ihrer Webanwendungen mithilfe von Javascript und HTML5 localStorage beizubehalten. Überprüfen Sie beim Starten Ihrer Web-App den dauerhaften Status und laden Sie ihn, falls verfügbar.

Informationen zur Verwendung von localStorage in Safari finden Sie hier: http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007256-CH1 -SW1

Hoffe das hilft dir. Zumindest für mich, da ich das gleiche Problem hatte wie Sie. :-)

René
quelle
4
@Crashalot Das Problem besteht bis heute und wird sich für eine Weile nicht ändern.
ErwinGO
1
Scheint nicht viel zu ändern. Android hat jedoch kürzlich eine verbesserte Webapp-Erfahrung durch Chrome hinzugefügt, die den Status für Sie zwischenspeichert. Aber das ist eine andere Plattform.
mix3d
2
Wie durch ein Wunder ist dies immer noch ein Problem: O
Pulsjet
Ich habe jetzt das gegenteilige Verhalten in iOS 12.2 Beta. Ich frage mich also, ob Apple die Dinge optimiert. Das Problem, das ich finde, ist, dass beim zweiten Start einer Web-App keine Skripte ausgeführt werden, da es so aussieht, als würden sie nur eine zwischengespeicherte Ansicht anzeigen.
Darren
@ Darren also wie ist das Urteil? Jetzt haben wir 12.4, was passiert? Können wir nicht einfach ein Cache-Manifest bereitstellen oder eine Art Webworker verwenden? Oder funktioniert das nicht für "Zum Startbildschirm hinzufügen"? Wie nennt man diese Apps "Standalone"?
Gregory Magarshak
1

Ich habe einen Hack gefunden, im iOS 11.4.1/12.0
Fenster zum Hochladen von Dateien geöffnet und dann wieder zum Startbildschirm gewechselt.
Die App funktioniert weiterhin, in meinem Fall wird Audio abgespielt und localStorageaktualisiert

Beweise: https://youtu.be/heehLUhGKYY

PS. Beachten Sie, wie sich der Fortschritt des Songs ändert, wenn wir suchen. Dies zeigt, dass die App im Hintergrund funktioniert

Artem Bernatskyi
quelle
-1

Die kurze Antwort ist, dass Sie dies nicht kontrollieren können. Manchmal hält iOS eine Web-App im Hintergrund aktiv, manchmal wird sie beendet. Es hängt ganz davon ab, wie viel Speicher auf dem Gerät verfügbar ist.

Ihr bester Ansatz ist es also, die Probleme zu minimieren, die durch dieses Neuladen entstehen. Stellen Sie sicher, dass Ihre Webanwendung die URL aktualisiert, wenn Sie von Ansicht zu Ansicht wechseln, indem Sie sie ändern location.hashoder verwenden history.pushState(). Auf diese Weise können Sie die Ansicht neu laden, in der sich der Benutzer befand, bevor er die Apps wechselte. Es gibt pagehideund pageshowEreignisse , die Ihnen erlauben , Code auszuführen , wenn der Benutzer sich von der App entfernt - diese Gelegenheit nutzen , lokale Zustand in localstorage zu speichern und / oder IndexedDB, holen dann wieder , dass die Daten , wenn die Webapp wieder geöffnet wird.

Alastair
quelle
1
iOS beendet die Webanwendung im Vollbildmodus immer bedingungslos , wenn Sie die App ausreichend verlassen und zu ihr zurückkehren. Wenn Sie beispielsweise die Starttaste drücken, um den Startbildschirm anzuzeigen, oder zu einer anderen App wechseln, wird die Vollbild-Webanwendung neu geladen, wenn Sie wieder zu ihr wechseln. Dies geschieht nur dann nicht, wenn Sie den App-Umschalter öffnen (zweimal die Home-Taste drücken) und Ihre Webanwendung erneut auswählen, anstatt zu einer anderen App zu wechseln. Sie sperren den Bildschirm, während Ihre App geöffnet ist, und entsperren ihn direkt Systemsteuerung und Herunterziehen und Hochdrücken der Benachrichtigungsmitte.
Binki
-1

Update: Da diese Antwort negative Stimmen erhält, habe ich diese Erklärung hinzugefügt.

Ihr Problem ist möglicherweise nicht das tatsächliche Neuladen, sondern die Tatsache, dass Mobile Safari den Cache und die Cookies Ihres Benutzers anders behandelt, wenn Ihre Webanwendung über den Browser geöffnet wird, als wenn sie als Webanwendung auf dem Startbildschirm "installiert" wird. Obwohl die hier vorgeschlagenen Lösungen, die localStorage verwenden, funktionieren, sind sie eine Menge Arbeit für die clientseitige Logik, die vermieden werden kann, wenn Ihr Server bereits dafür verantwortlich ist, den Sitzungsstatus Ihres Benutzers beizubehalten. Die 30-Sekunden-Lösung besteht darin, das Sitzungscookie einfach explizit auf eine längere Lebensdauer festzulegen.

Auf diese Weise können Sie den Status auch zwischen Neustarts des Geräts beibehalten. Auch wenn dies technisch nicht verhindert, dass die Web-App beim Start vom Startbildschirm aus neu geladen wird, ist dies eine einfache Möglichkeit, den Status für den Benutzer ohne ihn wiederherzustellen. Sie bemerkt das Nachladen - was in vielen Fällen, wie ich vermute, das eigentliche Problem ist.


Für eine ausführlichere Diskussion dieser Strategie und Codebeispiele werfen Sie einen Blick auf diese Fragen und meine Antworten dort:

Wilbo Beutlin
quelle
2
Ich glaube, das Problem hier ist etwas anders. Wenn Sie die vom Startbildschirm aus gestartete Seite laden, entspricht dies dem Klicken auf ein Lesezeichen, das eine URL lädt. Die Sitzung ist irrelevant. Dies führt dazu, dass die Seite neu geladen wird und der Status verloren geht, sofern sie nicht beibehalten und auf andere Weise geladen wird.
Chris A
Hallo Chris, in meinem Fall funktioniert das perfekt. Ich verwende keine andere Form von lokalem Speicher oder Cache als das Sitzungscookie, und der Status wird sogar wiederhergestellt, wenn ich mein Gerät zwischendurch herunterfahre und neu starte. Ich verwende nur die auf dem Startbildschirm installierte Web-App. Funktioniert meine Lösung nicht für Sie?
Wilbo Beutlin
1
Nein, ich habe das gleiche Problem wie das OP und musste eine localStorage-basierte Lösung implementieren. Ich habe Ihre Lösung verwendet, um die Sitzung fortzusetzen, aber sie hilft nicht beim Status. Die mit Lesezeichen versehene URL wird immer neu geladen. Ich frage mich, ob es noch einen Unterschied geben könnte.
Chris A
Natürlich wird die URL immer neu geladen; Dies ist nur eine Möglichkeit, die Sitzung während des App-Wechsels (und sogar des Neustarts des Geräts) am Leben zu erhalten. Wenn Sie dies nicht tun, kann sich Ihre Site nicht an Ihre vorherige Sitzung erinnern. Wenn Sie dies tun, können Sie die Seite des Statusservers beibehalten und immer wiederherstellen. Wenn Sie eine http-Anfrage wirklich vermeiden möchten, müssen Sie natürlich eine Form von lokalem Speicher verwenden.
Wilbo Beutlin
Dies ist keine End-All-Lösung und es ist auch nur ein Modifizieren eines Cookies ... Während einige hier eine Änderung erfahren, ist es höchstwahrscheinlich, dass ihr Server ohnehin nicht von Anfang an für die Produktion eingerichtet wurde. -1 aufgrund des Mangels oder der Recherche / des Verständnisses für dieses Problem und denken, dass diese Antwort am Ende dieser Seite stehen muss.
Wütend 84