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

Офлайн-приложение iOS: загружает мой манифест, но не работает в автономном режиме

Я пишу веб-приложение для использования в автономном режиме на iOS. Я создал манифест, я обслуживаю его как text/cache-manifest, и он работает нормально, когда работает внутри Safari.

Если я добавлю его в качестве приложения на свой домашний экран, включите режим полета, он вообще не сможет открыть приложение - я получаю сообщение об ошибке и предлагает закрыть приложение. (Я думал, что это была цель офлайн-приложения!)

  • Когда я загружаю приложение в первый раз, когда в сети, я могу видеть в своих журналах, что он запрашивает каждую страницу, указанную в манифесте.

  • Если я выключу режим полета и загрузив приложение, я увижу, что первым файлом, который он запрашивает, является мой файл main.html(который указан в манифесте и имеет атрибут manifest=...). Затем он запрашивает манифест и все мои другие файлы, получая 200 для всех (и 304 для чего-либо, запрошенного во второй раз во время этой загрузки).

  • Когда я загружаю страницу в Chrome и нажимаю, журналы показывают, что единственное, что она пытается найти на сервере, это "/favicon.ico" (это 404, и я не думаю, что iOS Safari пытается загрузить, так или иначе). Все файлы, указанные в манифесте, действительны и обслуживаются без ошибок.

  • Инспектор Chrome перечисляет в разделе "APPLICATION CACHE" все кэшированные файлы, которые я перечислял, которые я ожидаю. Весь набор файлов составляет около 50 КБ, что ни к чему не ограничено автономными ресурсами, которые я нашел.

Должен ли он работать, т.е. я должен был создать автономное приложение iOS, используя только HTML/CSS/JS? И где я могу разобраться, почему он не работает в автономном режиме?

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

4b9b3361

Ответ 1

Я подтверждаю, что имя cache.manifest решило проблему автономного кэширования в IOS 4.3. Другое имя просто не работает.

Ответ 2

Я обнаружил, что отладка автономных приложений HTML5 - это боль. Я нашел код из этой статьи, помог мне разобраться, что случилось с моим приложением:

http://jonathanstark.com/blog/2009/09/27/debugging-html-5-offline-application-cache/

Отладка HTML 5 автономного кэша приложений Джонатан Старк

Если вы хотите обеспечить автономный доступ к своему веб-приложению, кэш автономных приложений, доступный в HTML5, является убийцей. Тем не менее, это гигантский PITA для отладки, особенно если вы все еще пытаетесь обойти его.

Если вы боретесь с манифестом кэша, добавьте следующий JavaScript на главную страницу HTML и просмотрите вывод в консоли с помощью Firebug в Firefox или Debug > Показать консоль ошибок в Safari.

Если у вас есть какие-либо вопросы, PLMK в комментариях.

НТН,
J

var cacheStatusValues = [];
cacheStatusValues[0] = 'uncached';
cacheStatusValues[1] = 'idle';
cacheStatusValues[2] = 'checking';
cacheStatusValues[3] = 'downloading';
cacheStatusValues[4] = 'updateready';
cacheStatusValues[5] = 'obsolete';

var cache = window.applicationCache;
cache.addEventListener('cached', logEvent, false);
cache.addEventListener('checking', logEvent, false);
cache.addEventListener('downloading', logEvent, false);
cache.addEventListener('error', logEvent, false);
cache.addEventListener('noupdate', logEvent, false);
cache.addEventListener('obsolete', logEvent, false);
cache.addEventListener('progress', logEvent, false);
cache.addEventListener('updateready', logEvent, false);

function logEvent(e) {
    var online, status, type, message;
    online = (navigator.onLine) ? 'yes' : 'no';
    status = cacheStatusValues[cache.status];
    type = e.type;
    message = 'online: ' + online;
    message+= ', event: ' + type;
    message+= ', status: ' + status;
    if (type == 'error' && navigator.onLine) {
        message+= ' (prolly a syntax error in manifest)';
    }
    console.log(message);
}

window.applicationCache.addEventListener(
    'updateready',
    function(){
        window.applicationCache.swapCache();
        console.log('swap cache has been called');
    },
    false
);

setInterval(function(){cache.update()}, 10000);

Ответ 3

Иногда группа приложений кэширования попадает в плохое состояние в MobileSafari - она ​​загружает каждый элемент в кеш и затем запускает общее событие ошибки кэша в конце. Группа кеша приложений, согласно спецификации, основана на абсолютном URL-адресе манифеста. Я обнаружил, что при возникновении этой ошибки изменение пути к манифесту (например, cache2.manifest и т.д.) Дает вам новую группу кеша и обходит проблему. Я могу поручиться, что все наши веб-приложения работают автономно в полноэкранном режиме с 4.2 и 4.3.

Ответ 4

Нет автономного веб-приложения (с iOS 4.2) можно запускать без подключения к Интернету (что также означает режим самолета) при использовании <meta name="apple-mobile-web-app-capable" content="yes" /> в разделе html head. Я проверил это в каждом примере, который я видел, и те, которые используют Safari для рендеринга сайта, работают нормально, но когда вы вбрасываете этот метатег, это не сработает. Попробуйте приложение без него, и вы поймете, что я имею в виду.

Ответ 5

Я обнаружил, что очистка кеша Safari после того, как режим Airplane стал эффективным способом тестирования, действительно ли приложение работает в автономном режиме.

Меня иногда обманывали, думая, что кэш приложений работает, когда это не так.

Ответ 6

У меня есть несколько рабочих автономных и онлайновых веб-приложений.

Когда я выключаю режим в аэропорту, я получаю запрос на манифест и другие файлы.

Я не получаю запросы на изображения, JavaScript, CSS или кешированные файлы AJAX.

Если вы видите запросы на свои ресурсы, IOS не не кэширует их.

Сафари в целом более придирчив к манифесту.

Я предлагаю вам попробовать Safari на вашем компьютере.

Ответ 7

У меня есть одно возможное обходное решение для этого - кажется немного сумасшедшим, но здесь идет... Я много работаю с cache.manifest и полноэкранными приложениями (здесь тест, если вам нужно: http://www.mrspeaker.net/2010/07/12/argy-bargy/ - добавьте на главный экран, затем включите режим полета, и он запускается - по крайней мере, с iOS 4.2.1)

Одна странная вещь, которую я обнаружил, заключается в том, что иногда кажется, что какая-то "мета" информация в файлах может испортить их из кэширования. Вы когда-нибудь замечали, что в bash, если вы делаете "ls" некоторые файлы (в зависимости от ваших настроек цвета) выделяются без видимых причин? Файлы могут иметь метаданные, которые операционная система (я думаю) добавляет автоматически, - и есть способы ее удалить... Я не помню, почему, но вот еще несколько деталей: Метаданные из файлов в Snow Leopard

После разрыва моих волос один день - и отказавшись сдаться, потому что я знал, что это ДОЛЖНО работать... Хром говорил, что он загрузил все файлы, но закончил с общей ошибкой. В итоге я воссоздал структуру проекта с пустыми файлами и копировал/вставлял содержимое. Это сработало - началось кэширование, как и предполагалось!

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

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

Уф. В любом случае, рад, что я должен был написать это где-то...

[ОБНОВЛЕНИЕ: месяцы и месяцы спустя - я не смог воспроизвести это, так что я не думаю, что это метаданные]

Ответ 8

Сегодня я столкнулся с той же проблемой на iOS 4.3. Я смог решить проблему, добавив файл favicon.ico и добавив его в манифест.

Ответ 10

После нескольких дней беспорядочной работы с офлайн-приложениями для работы на iPhone/iPod Touch с использованием HTTP-аутентификации веб-сервера я обнаружил эти полезные самородки:

  • Убедитесь, что Safari находится в корневом URL-адресе веб-приложения при нажатии "Добавить на главный экран". Я использовал jQuery Mobile и иногда добавлял ссылку "/# pageId". Вызванная проблема.

  • Запускайте вызовы Ajax в последовательном порядке. Это может быть важно только в том случае, если ваше веб-приложение использует HTTP-аутентификацию, но мое приложение запускает множество вызовов Ajax при загрузке страницы параллельно, и это заставляет приложение зависать на "apple-touch-startup-image".

  • Ajax-вызовы являются "успешными" в автономном режиме (по крайней мере, с помощью Prototype.js). Проверьте фактическую часть данных в ответе Ajax, а не только на статус HTTP. Я использовал это для проверки отображения кэшированных (SQL) или живых данных.

  • В манифесте используется "NETWORK:\n *\n". Из того, что я мог бы собрать, это выражение для всех, что явно не указано в разделе "CACHE:". Используйте Chrome, чтобы убедиться, что ваш манифест верен. Обратите внимание на консоль Chrome для ошибок.

  • Не связано напрямую, но немного сработал, вызовы openDatabase.transaction() являются ASYNCHRONOUS! Значение строки JS-кода после транзакции (execute(), error(), success()) будет выполняться перед функцией success().

Удачи!

Ответ 11

Я столкнулся с этой проблемой iOS 4.3 "без автономного кэша", так как я обновил свой iPad до 4.3.1 с 4.2. Я видел в другом посте этого сайта, что он снова работал в 4.3.2. Поэтому я обновил iPad снова, теперь до iOS 4.3.3. Но до сих пор не удалось заставить автономное кэширование работать, пока я не переименовал файл манифеста в "cache.manifest". Затем кеширование снова заработало, и я могу запустить автономное приложение HTML5 с главного экрана. Мне не нужно было помещать favicon.ico в манифест кэша. И у меня также был полный экран (настройка "apple-mobile-web-app-able" на "yes" ).

Ответ 12

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

http://www.offlinewebapp.com/solved-apple-mobile-web-app-capable-manifest-error/

  • Удалите текущий значок веб-приложения на главном экране.
  • Перейдите к настройкам и очистите кэш браузера Safari.
  • Дважды нажмите кнопку "домой", чтобы открыть панель многозадачности. Найдите Safari один, держите палец на нем и выйдите из него.

Пожалуйста, дайте мне знать, если это сработает и для вас! Удачи!

Ответ 13

Я написал приложение, и он отлично работает в мобильном браузере, но при добавлении рабочего стола... Не работает. Я думаю, что яблоко отказалось от IOS4, и все усилия теперь идут на OS5. Позор: (