Vraag iOS7 Safari: opslaan naar startscherm en persistentietoken


Voor iOS 6. [iets] later Cookies, SQLite-gegevens en lokale opslaggegevens voor web-apps op volledig scherm worden afzonderlijk van de Safari-gegevens opgeslagen. Ik heb een token dat ik moet doorgaan naar de Home-Screen-app bij het opslaan naar het startscherm.

Er is een cookie-tester hier. En een discussie hier.

Heeft iemand een elegante oplossing gevonden voor dit probleem? Zeer lelijke oplossingen zullen ook overwogen worden :)


21
2018-01-14 09:10


oorsprong


antwoorden:


Sinds iOS 5 maakt Apple Home-bladwijzers steeds meer geïsoleerd in termen van het delen van gegevens tussen de Safari-browser en wat nu als een sandbox-applicatie wordt beschouwd.

  • iOS <= 5: Alles was cool, lokale opslag, cookies, de werken werden gedeeld tussen het startscherm en de webpagina. De overgang tussen de site en het startscherm verliep naadloos en webontwikkelaars waren tevreden.
  • iOS 6: Apple begon Home Screen-apps (inclusief die van het web) te verwerken als sandbox-applicaties. In wezen werd de Home Screen-app die uw opgeslagen site weergeeft, een WebView-besturingselement en nam Safari niet zelf op. Hierdoor kon lokale opslag niet worden overgedragen, maar kon je nog steeds cookies delen.
  • iOS <= 6.x: Cookies werden enigszins onbetrouwbaar na een bepaalde dot-release, ze werden nog steeds gedeeld, maar werden niet overgedragen bij de eerste keer opslaan. Als u terugging naar de site en wat actie uitvoerde, zou de cookie op magische wijze beschikbaar worden voor de Home Screen-app.
  • iOS 7: Alle vormen van gegevensuitwisseling (lokale opslag, cookies, enz.) Tussen het startscherm en de site waarvan het is opgeslagen, zijn (bijna) verloren gegaan, waardoor de dromen van ontwikkelaars over de hele wereld verpletterd zijn.

Op het moment van schrijven (iOS 7.1 in bèta), heb je maar één optie.

  1. Wanneer uw pagina wordt geladen, voegt u uw token / gegevens toe aan een queryreeksparameter in de URL met JavaScript (window.location.search). Wanneer de gebruiker de site op zijn startscherm opslaat, wordt de URL als sleutel gebruikt. Uw JavaScript kan eenvoudig de queryparameter van de query die u stiekem eerder hebt ingepakt extraheren als u detecteert dat u zich in de startschermmodus bevindt (window.standalone). Dit zou voor altijd moeten werken, behalve dat de waarde in de URL er ook voor altijd zal zijn.

  2. Een andere truc is om elke waarde die u wilt overdragen naar het startscherm in de DOM te 'renderen'. Sinds de eerste versies van iOS blijft de HTML die wordt weergegeven op het moment dat deze wordt opgeslagen op het beginscherm, ongewijzigd. Bij het starten van een web-app op het startscherm, het vraagt ​​niet om de inhoud van de URL. Het laadt gewoon de HTML die eerder was opgeslagen zonder eerste webverzoek (alle links naar CSS en JS in de HTML worden opgevraagd, maar niet de pagina zelf). Met de wetenschap dat de HTML voor altijd is opgeslagen, wordt ook alles wat u daarin hebt weergegeven, ook opgeslagen. De enige manier om uw pagina bij te werken, is door a windows.reload of equivalente omleiding als u uw inhoud niet via AJAX haalt. Om een ​​lang verhaal kort te maken, injecteer je waarde bijvoorbeeld in een verborgen invoerveld en deze wordt overgezet.

Optie # 1 zal waarschijnlijk voor altijd meegaan, het is niet waarschijnlijk dat het startscherm ooit de URL op enige manier zal wijzigen. Zorg ervoor dat je een JS op zijn plaats hebt om een ​​schakelaar om te draaien en de pagina opnieuw te laden als je er ooit vanaf wilt.

Optie # 2 is enigszins riskant omdat op een dag het alwetende Apple zou kunnen besluiten dat een eerste paginavraag eigenlijk zou moeten worden gemaakt in plaats van dezelfde HTML te gebruiken op het moment dat het werd opgeslagen. Hiermee worden de gegevens die u hebt en de huidige status van alle elementen in de DOM gewist.

BIJWERKEN: De DOM-injectietechniek is niet langer geldig (iOS 7+), alleen de DOM die direct van de server is gedownload, wordt opgeslagen op het startscherm. Dynamische wijzigingen die tijdens runtime worden aangebracht, gaan verloren. Uitgeschakeld optie # 2, omdat de vraag voor iOS 7 is en het langer werkt, waardoor je alleen optie # 1 hebt, iets toevoegt aan de URL die altijd wordt opgeslagen op het startscherm.


36
2018-01-22 19:29