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