Intereting Posts
Android Maps API v2 в диалоге Не удалось слияние манифеста: uses-sdk: minSdkVersion 10 не может быть меньше версии L, объявленной в библиотеке com.android.support:appcompat-v7:21.0.0-rc1 Android-разработчик переходит на iOS. Что мне нужно знать? Как передать данные из BroadcastReceiver до запуска Activity? Получить номер телефона без кода страны в Android Android – Как получить доступ к элементам меню панели действий в классе фрагментов Установите разрешение «разрешить» по умолчанию в «Автозагрузке Asus» из кода Использование структуры Redux с Firebase в Android Редактирование функциональности эмуляции гостевой карты в Android Отступ разделителя, игнорируя его Как отключить Android LocationListener, когда приложение закрыто Контекст приложения, возвращающий значение null при использовании getFilesDir () Как отправлять / получать push-уведомления от ионного мобильного приложения? Контактная информация для Android: как получить обратную ссылку (Google) из Интернета (и, таким образом, «отменить» прежнее локальное изменение изображения) Как программно создать стиль темы Android?

Android 4.0 -> 4.3 (включено) – веб-хранилище потеряно между страницами веб-просмотра

Я работаю над проектом Android, который полагается на WebView для просмотра нескольких HTML-страниц, хранящихся на устройстве, и отправки входов в веб-представление, когда это необходимо для их хранения в базе данных.

Каждая страница содержит элементы управления, связанные с jQuery в сторону предыдущих / следующих страниц, каждая страница содержит входы разных типов (флажки, текстовые поля и т. Д.).

На последней странице содержатся кнопки отправки, которые используют JSInterface для сохранения результатов внутри SQLite DB.

Другая кнопка (в пользовательской верхней панели навигации) предлагает ту же систему.

Результаты могут быть изменены путем доступа к первой странице со всеми сохраненными входами, система jQuery будет заполнять соответствующие входы.

Для более подробной информации я использую SDK 19 и компилирую против 4.4.2 , но я работал с SDK 15 и компилировал против 4.2.2, где у меня не было этой проблемы.

Если кому-то нужно посмотреть, что делается, в упрощенной системе, проверьте этот JSBin .


Проблема

Я использую SessionStorage для хранения входных данных между страницами, которые я использовал для работы с куки-файлами, но они стали ненадежными, когда было более 150 пар ключей / значений.

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


Протокол испытаний

1-й случай – пребывание только на первой странице

Если я останусь только на первой странице, заполните входы, затем отправьте результаты, все в порядке. Возвращение для модификации предлагает мне полностью заполненную первую страницу.

Второй случай – перемещение между страницами

После заполнения страницы 1 я перехожу на страницу 2 и заполняю новые входы, затем перемещаюсь между страницами, чтобы увидеть, потеряны ли входы на каждой отдельной странице. Все на месте, но если я отправлю результаты, будут переданы только текущие входы страницы.


Результаты тестирования версий Android

  • 3.2 – Работы

  • 4.1.2 – Не работает

  • 4.2.1 – не работает

  • 4.3 – Не работает

  • 4.4.2 – Работает


Протестированные решения

  • Переопределение метода shouldOverrideUrlLoading для WebViewClient для возврата False – не работает

  • Использование LocalStorage вместо SessionStorage не изменило ничего

Insights

Переключение с sessionStorage на localStorage не помогло.

Я нашел полезную информацию о версиях WebKit, используемых Android:

Android 3.2.1 использует довольно старую версию, но она работает (v534.13)

Android версии от 4.0 до 4.3 используют один и тот же движок WebKit (v534.30)

Android 4.4 использует совершенно новую версию (v537.36), которая объясняет, почему она работает

Ни один шаг к исправлению, но он дает более точное представление о проблеме и устройстве, на которое он влияет.

Решение

Начиная с SDK 16, новый параметр безопасности был вынужден запретить Javascript-код для доступа к контенту из любого источника.

if(Build.VERSION.SDK_INT >= 16) { setting.setAllowUniversalAccessFromFileURLs(true); } 

Престижность кшак за это!

[РЕДАКТИРОВАТЬ 18/02/2014]

После некоторого тестирования я указывал проблему на TargetSdkVersion, BuildTarget ничего не меняет.

Он установлен в 15 , WebStorage работает по назначению.

Если он установлен на 16 или выше, WebStorage запутывается.

Solutions Collecting From Web of "Android 4.0 -> 4.3 (включено) – веб-хранилище потеряно между страницами веб-просмотра"

Между ICS (SDK 15) и JellyBean (SDK 16) произошли некоторые изменения в модели безопасности WebView и как она обрабатывает javascript из файла: // origin. Попробуйте позвонить

 WebSettings.setAllowUniversalAccessFromFileURLs(true) 

Чтобы подтвердить, что вы работаете с файлами: // URL-адреса и доверяете содержимому, которое вы показываете. Я предполагаю, что из-за обновления до Chromium WebView в 4.4 что-то еще изменилось в базовой реализации, чтобы не требовать этих настроек.

Мне жаль слышать, что у webstorage api есть проблема на Android, потому что я буду использовать это в ближайшие несколько дней.

Как вы уже исследовали, Android 4.4 использует brandnew WebView, основанный на ChromeBrowser, где многие веб-технологии, такие как webScoket и т. Д., Отличные от localStorage api, уже хорошо поддерживаются.

Сказав, что, читая ваши претензии, у localStorage api есть проблема для android4.0-4.2 (которую я также ставил в качестве целевых устройств), я подумал, что вместо этого вместо использования FileSystem api .

http://www.html5rocks.com/en/tutorials/file/filesystem/

Однако, глядя на Интернет, он настолько неопределен, что этот api работает хорошо, и, наконец, я нашел это.

Использование локального хранилища в веб-браузере Android

https://github.com/didimoo/AndroidLocalStorage

Я понимаю, что хранилище сеансов существует, а окно, которое его создало, все еще открыто, а локальное хранилище постоянно между сеансами. Так браузер рассматривает окно, чтобы оставаться открытым при навигации между двумя локальными файлами? Это может быть открыто для интерпретации. Глядя на ваш код, кажется довольно легко изменить его, чтобы использовать локальное хранилище, а не сеансовое хранилище, так что это вариант?