Как Заставить Сайт Работать Как Веб-Приложение (Пример Частного Решения, Никому Не Интересного, К Тому Же Плохо Описанного)

Наверное, это своего рода продолжение темы» Различия в адаптации сайта и веб-приложения AJAX для iOS "и развитие идей от моего Комментарии там.

Тема старая, но для многих до сих пор актуальна.

В целом внутри будет много специфики, так как цель не придумать универсальное решение, а просто заставить один конкретный сайт работать как Web App, не прибегая к серьезным модификациям.

В общем, как обычно, на разрез идут те, кому интересно, остальные, наверное, проходят мимо.

Итак, обозначим вводные задачи и проблемы: нам нужно убедиться, что сайт (обычный, ничего особенного) работает как веб-приложение, не запрыгивая в Safari и не запоминая, на какой странице находился клиент и что он там делал.

Думаю, те, кто дочитал до этого момента, прекрасно знают, какие проблемы не позволяют сделать все вышеперечисленное, ничего не делая: любая нормальная ссылка открывается в Safari, если переключиться с Web App на другое приложение, или свернуть то, когда вы его откроете, будет показана страница, которая на самом деле была сохранена как веб-приложение — чаще всего основная.

В общем, сухие задачи: 1) сделать так, чтобы в Safari не выкидывались ссылки; 2) сделать занятие запоминающимся; 3) убедиться, что открытая страница запомнилась.

В отличие от исходной темы, я ставлю задачи именно в таком порядке; ниже будет понятно почему.

Поехали решать!



Ссылки не должны выдаваться в Safari

Этот вопрос уже давно обыгран и решен.

Вам просто нужно поймать все клики по ссылкам в JS и преобразовать их в местоположение.

назначить() .

(Почему-то с давних времен вместо location.assign() везде использовалось присвоение window.location — не знаю, с чем это связано, наверное, так считалось более правильным, когда деревья были большими.

) В целом ничего нового я здесь не придумал, просто пришлось немного расширить: 1) это применимо только в автономном режиме; 2) если ссылка «внешняя» (с другим хостом), то она не применяется (открывается Safari); 3) если ссылка является анкором (#какая-то херня), то заменяется только location.hash. То есть вы включаете этот обработчик в автономном режиме, требуете, чтобы ссылка имела href, а затем отлаживаете его для конкретного случая.

Кода здесь не будет, потому что там одна строка и много деталей, которые никого не интересуют, потому что это не их детали.



Сеанс должен запомниться

Здесь сложнее.

Проблема в том, что при перезапуске веб-приложения файлы cookie не отправляются; кукисов нет - сессия новая.

Тележка потерялась.

В общем, это плохо.

В исходной теме было решение с чтением и записью куки прямо из JS, но как я писал в комментариях - в современных реалиях это работает не очень хорошо - сессионный куки теперь httpOnly, то есть он не виден в JS ни в коем случае.

Решим немного по-другому: идентификатор будем хранить так же в localStorage, но сравнивать и управлять сессией будем со стороны сервера, а обрабатывать все это будем через ajax. В JS делаем что-то вроде этого (тоже только для автономного режима):

   

$.

post('/super-puper-server-script.json', {'sid': localStorage.getItem('sid')}, function(data) {

Теги: #веб-приложение #iOS #cookie #localstorage #session #разработка веб-сайтов #JavaScript #разработка iOS
Вместе с данным постом часто просматривают: