阻止iOS上本地Web应用程序在打开时重新加载自身

30

我正试图在iOS上使用HTML + JS构建一个“本地Web应用程序”。 如您所知,您可以将此类应用程序添加到主屏幕上,它看起来或多或少像普通的本机应用程序。

但是,如果我退出这样的应用程序并再次打开它,它会重新加载整个页面。当从另一个应用程序切换到此类应用程序时,也会发生这种情况。

这是预期的行为还是有办法阻止设备这样做?

例如,您可以将jqTouch-Demos从此处添加到主屏幕并进行测试:http://jqtouch.com/preview/demos/main/


请查看我的答案:https://dev59.com/WW865IYBdhLWcg3wcOLG#40707231 - Jeshurun
4个回答

10

你可以在localStorage中保存你的应用程序状态。在重新启动时,检查状态是否正在运行,然后将应用程序恢复到其上次运行的位置。


我通过创建一个编译为iOS 4.2并支持多任务处理的WebView应用程序来解决了这个问题。这对我来说完美地解决了问题。 - cguedel
我认为ghenne的建议目前可能是最好的解决方案。 - René
你如何保存 cookies / 会话状态? - Chetan
除非您有一个非常简单的应用程序,否则没有单一的步骤可以完成此操作。存储一条消息,指示要在重新启动时恢复值的每个全局变量的状态和值。 - ghenne
@Chetan:你可以使用我下面的策略来存储会话cookie。它不会阻止应用程序重新加载,但它确实保持了会话的活动状态(即使在通过Safari查看您的网站时安装了Web应用程序)。 - Wilbo Baggins

2

我也遇到了同样的问题。无论如何,如果你不想重复造轮子,可以使用像PhoneGap这样的工具(http://www.phonegap.com/)。它是一个本地Web应用程序包装器,内置许多本地功能。此外,你可以将应用程序存储在本地(快速、安全),当然也可以对其收费;)它基于BSD或MIT许可证。


2

更新:由于这个回答受到了负面评价,我添加了这个解释。

你的问题可能并不是实际的重新加载,而是当你的Web应用程序通过浏览器打开时,Mobile Safari处理用户缓存和Cookie的方式与在主屏幕上“安装”为Web应用程序时不同。虽然这里提出的使用localStorage的解决方案可以起作用,但它们需要客户端逻辑的大量工作,如果你的服务器已经负责持续保存用户会话状态,那么这些工作是可以避免的。30秒的解决方案是简单地将会话Cookie明确设置为具有更长的生命周期。

这使您能够在设备重新启动之间保持状态完整,因此即使从主屏幕启动时不会在技术上停止Web应用程序的重新加载,这是一种容易的方式来为用户恢复状态,而不让他/她注意到重新加载——在许多情况下,我认为这才是真正的问题。


要获得关于此策略和代码示例的更详细讨论,请查看以下问题及其答案:


2
这并不防止重新加载,但它保留了会话变量,这似乎是主要问题,而不是重新加载的事实。 - Niclas

0
你可能想看看使用缓存清单(cache-manifest)来防止它加载文件。
Matt Might在这里有一篇好的写作:

http://matt.might.net/articles/how-to-native-iphone-ipad-apps-in-javascript/

基本上,您需要将HTML标签更改为这个

<html manifest="cache.manifest">

在服务器上编写一个cache.manifest文件,指定哪些文件应该保存在设备缓存中,哪些应该从网络动态重新加载。
CACHE MANIFEST
local1.file
local2.file

NETWORK:
network1.php
network2.cgi

你还需要确保你的web服务器可以提供MIME类型为text/manifest的.manifest文件,否则这将无法工作。如果你正在使用apache,请将以下内容放入你的.htaccess文件中:
AddType text/cache-manifest .manifest

很好的解释,但不幸的是,它并没有解决 Web 应用在多任务时重新加载和丢失状态的问题。 - René

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接