Подтвердить что ты не робот

IOS7 Safari: сохранение на главном экране и сохранение токена

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

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

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

4b9b3361

Ответ 1

Так как iOS 5 Apple делает закладки Home Screen все более изолированными с точки зрения совместного использования данных между браузером Safari и тем, что теперь рассматривается как приложение для песочницы.

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

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