iPhone WebApp на домашнем экране - PullRequest
10 голосов
/ 02 ноября 2011

Я создал веб-приложение, которое можно сохранить на «Домашнем экране» на iPhone.Приложение использует холст и является довольно интерактивным с изменяющимся состоянием.

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 02 ноября 2011

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

  1. Определить минимизированный? Запуск в фоновом режиме?

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

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

    - (void)applicationWillTerminate:(UIApplication *)application

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

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

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

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

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

1 голос
/ 02 ноября 2011

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

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

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

0 голосов
/ 20 апреля 2016

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

ctx.getImageData()
  • и сохраняет их в локальном хранилище, затем, когда страница перезагружается, вы можете поместить эти данные непосредственно на холст для почти мгновенной перезагрузки и положить спиннер поверх, пока вы загружаете реальное приложение за ним.
0 голосов
/ 02 ноября 2011
  1. Я не думаю, что вы можете
  2. WebKit поддерживает хранение данных на стороне клиента HTML5, которое вы могли бы использовать
  3. Я не знаю, каким образом ваш webApp будет получать уведомления озакрытие, поэтому вы должны попытаться сохранить текущее состояние после каждого шага навигации и т. д. ( Фоновое поведение для iOS Web App (чтобы приложение не перезагружалось) ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...