Веб-приложение HTML5 не кэшируется при добавлении на главный экран в iOS - программирование
Подтвердить что ты не робот

Веб-приложение HTML5 не кэшируется при добавлении на главный экран в iOS

Чтобы быть ясным, кэширование веб-приложений IS и работает в офлайн-режиме в Mobile Safari.

Проблема заключается в том, что она добавляется на главный экран iPhone 4s и iPad 2, работающих под управлением iOS 6.0.1. Он не будет работать в автономном режиме и даст сетевую ошибку для подключения к Интернету, то есть "Невозможно открыть MYWEBAPP. MYWEBAPP не может быть открыт, потому что он не подключен к Интернету"

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

Я тестировал приложение на настольных инструментах Safari, Chrome и Firefox как в режиме онлайн, так и в автономном режиме. Также как веб-инспектор с устройствами в Safari. Результат такой же на iPhone или iPad. Они оба кэшируют веб-приложение и будут работать в Mobile Safari, но не при добавлении на главный экран. Нет ошибок в автономном режиме или в режиме онлайн.

Насколько я знаю, я использую лучшие практики:

  • Добавлен заголовок HTML: <html manifest="photo.appcache">

    Я также экспериментировал с использованием разных имен для файла манифеста, включая: cache.manifest и offline.manifest, поскольку я читал, что это имеет значение, но при моем тестировании не имеет значения, какое имя указано до тех пор, пока расширения являются .manifest или .appcache и соответствующим образом обслуживаются в файле .htaccess.

  • Добавлены правильные типы MIME: AddType text/cache-manifest appcache manifest

    Я также пробовал: AddType text/cache.manifest manifest,            AddType text/cache.manifest .manifest manifest, AddType text/cache-manifest .manifest

    Я не считаю, что это сработало: AddType text/cache.manifest но я не помню. По большей части это не имело значения, и я придерживался:

    AddType text/cache-manifest appcache manifest

    как это было в Mobile Boilerplate HTML5.

  • Добавлено:

СЕТЬ: *

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

  1. Я попытался удалить эту строку: <meta name="apple-mobile-web-app-capable" content="yes"> потому что я читаю здесь, на SO, что решает проблему, похожую на мою, но я могу подтвердить, что она не работает в моем тестировании. Удаление этой строки или настройка содержимого на "нет" при нажатии на значок главного экрана будет перенаправляться на Mobile Safari, а не на полноэкранный режим.

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

4b9b3361

Ответ 1

Я решил эту проблему. Я рекомендую следующие веб-приложения для домашнего экрана в iOS 6.

Для целей тестирования используйте веб-инспектор и приятный JS script, такой как Джонатан Старк, чтобы узнать, когда приложение было кэшировано в Mobile Safari:

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

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

Поскольку мой кэш приложений - 22 МБ данных, а кеширование данных - ОТДЕЛЬНОЕ для веб-приложения, проблема, с которой я столкнулась, не оставляла приложение на домашнем экране открытым достаточно долго для кэширования.

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

Насколько я знаю, нет способа отлаживать данные, кэшированные для домашнего веб-приложения или где он хранится.

Ответ 2

Ответ выше был очень полезным. @aul сказал, что он не знал, как отладить веб-приложение для домашнего экрана, но я нашел способ.

Подключите iPad или iPhone к компьютеру, затем в Safari перейдите в раздел "Разработка" > и выберите свое устройство. Ваше домашнее приложение должно быть открыто, чтобы оно отображалось в раскрывающемся меню. После доступа к приложению вы можете открыть консоль ошибок и посмотреть Джонатан Старк script перейти на работу. После загрузки манифеста вы сможете использовать приложение в автономном режиме.

Ответ 3

Этот script облегчил жизнь! Благодаря @Paul!

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);

Ответ 4

У меня была проблема с двумя частями. Я генерировал манифест кэша с помощью ASP.NET MVC/Razor, потому что я хотел иметь возможность легко размещать сайт у виртуального приложения и все еще иметь пути. Тип содержимого не был правильно установлен в манифест кеша, поэтому Internet Explorer и Safari (iOS) не узнали его (хотя Chrome на ПК и Android).

Как только я решил эту проблему, она все еще не работала, когда я пытался получить доступ к моему приложению Azure с iOS Safari. Когда я попытался получить доступ с помощью Internet Explorer, я увидел, что у него не было правильного типа mime для шрифта, который у меня был.

Итак, слово предупреждения: будьте абсолютно уверены в типе mime не только манифеста, но и всех файлов, от которых зависит манифест.