IPhone WebApp настойчивость на главном экране

Я создал webapp, который можно сохранить на "Начальном экране" на iPhone. Приложение использует холст и довольно интерактивно с изменяющимся состоянием.

Всякий раз, когда приложение сведено к минимуму и снова открывается, он возвращается в исходное состояние. То же самое (как и ожидалось) происходит при закрытии приложения и его перезагрузке.

  • Как я могу предотвратить перезагрузку приложения, когда оно просто минимизировано?

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

  • Какие события мне нужно использовать, чтобы гарантировать, что данные состояния не будут потеряны?

Если возможно, кросс-платформенное решение было бы предпочтительнее iPhone + Android...

Ответ 1

TL; DR Вам нужно будет разработать приложение для использования локального хранилища или файлов cookie или другого механизма, с помощью которого вы можете сохранить состояние. Он должен будет посмотреть на это локальное хранилище и перестроить его интерфейс каждый раз, когда он запускается. Используя локальное хранилище или webdb (обесценивается, но поддерживается), вам нужно сохранить каждое изменение состояния и убедиться, что вы перезагрузите их, когда ваша страница загружается в браузере.

  • Определить минимизацию? Запуск в фоновом режиме?

    Ваш webapp, независимо от его статуса на рабочем столе, представляет собой просто другую страницу, загруженную в браузер. Из-за отсутствия памяти на устройстве и б), как многозадачность работает, операционная система может запросить приложения для освобождения памяти или даже для завершения работы в любое время.

    Вот почему, когда вы создаете приложение iOS, у вас есть:

    - (void)applicationWillTerminate:(UIApplication *)application

    Этот метод позволяет вам, как разработчику, указывать поведение для использования (например, сохранение пользовательских данных) до того, как ваше приложение завершит работу, когда оно получит сигнал завершения работы от ОС. Это также объясняет, почему руководства iOS-разработчиков просят вас сохранить состояние и всегда следить за тем, чтобы ваше состояние было восстановлено, когда приложение выведено на передний план. (Пользователи могут не знать, что приложение прекратилось, поскольку оно все равно появится в списке "запущенные приложения" при двойном щелчке по дому).

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

    Поэтому, когда вы помещаете Safari в фоновом режиме, Safari, скорее всего, уничтожает ваш кеш в памяти.

  • Safari имеет доступ как к локальным данным хранилища, так и к файлам cookie. iOS5 также имеет доступ к WebSQL (но не IndexedDB, который печален, потому что WebSQL обесценивается). Выберите яд.

  • Вам нужно всегда сохранять состояние. Поскольку у вас нет доступа к методам UIApplicationDelegate через JS, каждый раз, когда пользователь что-то делает, вам нужно сохранить это изменение состояния. И каждый раз, когда ваша страница перезагружается, для проверки состояния и перезагрузки требуется выбранная вами опция хранения.

Ответ 2

Если вы сохраняете текущее состояние с помощью localStorage API и восстанавливаете его из этого API при загрузке, вы должны иметь возможность воссоздать состояние приложения.

Я рекомендую эту страницу для обзора локального API хранения: http://diveintohtml5.info/storage.html

Я боюсь, что вам не удастся помешать приложению/веб-странице в памяти, когда она находится в фоновом режиме, но постоянно сохраняет состояние в localStorage и восстанавливает состояние при загрузке страниц (window.onload или $(document).ready()) будет решением.

Ответ 3

Ответ 4

Если ваше приложение использует только холст для рендеринга, вы можете привязать функцию к событию window.unload или screenhide, чтобы всякий раз, когда страница выгружается, функция захватывает пиксельные данные холста с помощью

ctx.getImageData()
  • и сохраняет это в localstorage, а затем, когда страница перезагружается, вы можете вытащить эти данные непосредственно на холст для почти мгновенной перезагрузки и поместить spinner ontop во время загрузки реального приложения за ним.