iOS7 Safari: сохранение на домашний экран и сохранение токена

Для iOS 6.[что-то] и далее Файлы cookie, данные SQLite и localStorage для полноэкранных веб-приложений хранятся отдельно от данных Safari. У меня есть токен, который мне нужно сохранить в приложении Home-Screen при сохранении на Home-Screen.

Здесь есть тестер печенья. И обсуждение здесь.

Кто-нибудь нашел элегантное решение этой проблемы? Очень некрасивые решения тоже будут рассмотрены:)

1 ответ

Решение

Начиная с iOS 5, Apple делала закладки на главном экране все более изолированными с точки зрения обмена данными между браузером Safari и тем, что сейчас считается приложением-песочницей.

  • iOS <= 5: все было круто, локальное хранилище, файлы cookie, работы были разделены между домашним экраном и веб-страницей. Переход между сайтом и домашним экраном прошел гладко, и веб-разработчики остались довольны.
  • iOS 6: Apple начала рассматривать приложения на домашнем экране (в том числе сохраненные из Интернета) как изолированные приложения. По сути, приложение "Домашний экран", которое отображало ваш сохраненный сайт, стало элементом управления WebView и не включало само Safari. Это предотвратило передачу локального хранилища, но вы все равно могли делиться файлами cookie.
  • iOS <= 6.x: файлы cookie стали несколько ненадежными после определенной версии, они все еще были доступны, но не были переданы при первом сохранении. Если вы вернулись на сайт и выполнили какое-то действие, файл cookie волшебным образом стал бы доступен для приложения Home Screen.
  • iOS 7: Все формы совместного использования данных (локальное хранилище, файлы cookie и т. д.) между домашним экраном и сайтом, с которого они были сохранены, были потеряны (почти), разрушая мечты разработчиков по всему миру.

На момент написания (iOS 7.1 в бета-версии) у вас был только один вариант.

  1. Когда ваша страница загрузится, добавьте свой токен / данные в параметр строки запроса в URL с помощью JavaScript (window.location.search). Когда пользователь сохраняет сайт на главном экране, в качестве ключа используется URL-адрес. Ваш JavaScript может легко извлечь параметр строки запроса, который вы использовали ранее, если вы обнаружите, что находитесь в режиме главного экрана (window.standalone). Это должно работать вечно, за исключением того, что значение в URL также будет всегда.

  2. Еще один трюк, который заключается в "рендеринге" любого значения, которое вы хотите перенести на домашний экран в DOM. Начиная с ранних версий iOS, HTML-код, отображаемый во время сохранения на главном экране, останется неизменным. При запуске веб-приложения главного экрана оно не запрашивает контент с URL-адреса. Он просто загружает HTML, который был ранее сохранен без первоначального веб-запроса (будут запрашиваться все ссылки на CSS и JS в HTML, но не сама страница). С осознанием того, что HTML будет сохранен навсегда, то же самое можно сделать и с ним. Единственный способ обновить страницу - это windows.reload или эквивалентное перенаправление, если вы не тянете свой контент через AJAX. Короче говоря, введите ваше значение в скрытое поле ввода, например, и оно будет перенесено.

Вариант № 1, вероятно, будет длиться вечно, маловероятно, что домашний экран когда-либо изменит URL-адрес. Просто убедитесь, что у вас есть JS, чтобы щелкнуть переключателем и перезагрузить страницу, если вы когда-нибудь захотите от нее избавиться.

Вариант № 2 является несколько рискованным, потому что однажды все знающие Apple могут решить, что на самом деле должен быть сделан первоначальный запрос страницы вместо того, чтобы использовать тот же HTML в тот момент, когда он был сохранен. Это затем уничтожит имеющиеся у вас данные и текущее состояние любых элементов в DOM.

ОБНОВЛЕНИЕ: техника внедрения DOM также больше не действует (iOS 7+), только DOM, непосредственно загруженный с сервера, сохраняется на главном экране. Любые динамические изменения, сделанные во время выполнения, будут потеряны. Вычеркнут вариант № 2, так как вопрос касается iOS 7, и он дольше работает, что оставляет вам только вариант № 1, добавив что-то к URL, который всегда будет сохранен на главном экране.

Другие вопросы по тегам