2011-11-02 75 views
10

我已经创建了一个可以保存到iPhone上的“主屏幕”的web应用程序。该应用程序使用画布,并与状态更改相当互动。主屏幕持久性iPhone WebApp

每当应用程序最小化并重新打开时,它将重置回初始状态。关闭应用程序并重新加载时会发生同样的情况(如预期的那样)。

  1. 我怎样才能防止应用程序重新加载时,它只是最小化?

  2. 坚持状态数据的最佳方式是什么?当应用程序关闭并重新打开时,它会无缝地继续?

  3. 我需要使用哪些事件来确保状态数据不会丢失?

如果可能的话一个跨平台的解决方案是首选iPhone + Android的...

回答

8

TL; DR 您需要将您的应用程序设计为使用本地存储或cookie或其他一些可以保留状态的机制。每次启动时,它都需要查看本地存储并重新构建它的界面。使用本地存储或webdb(折旧但支持),您需要保存每个状态更改,并确保在页面加载到浏览器时重新加载它们。

  1. Define minimized?在后台运行?

    您的web应用程序,无论它在主屏幕上的状态如何,只是另一个页面加载到浏览器。由于a)设备上的内存不足,以及b)多任务如何工作,操作系统可能会要求应用程序释放内存或者甚至在任何时候自行终止。

    这就是为什么当你正在构建一个iOS应用程序,你必须:

    - (void)applicationWillTerminate:(UIApplication *)application

    此方法允许您,作为开发者,指定行为,以便使用(如保存用户数据)之前,您的应用程序在从操作系统收到终止信号时终止。这也是为什么iOS开发人员指南要求您保留状态并且始终确保您的状态在应用程序进入前台时恢复的原因。 (用户可能不知道某个应用程序已终止,因为当您双击该主页时它仍会出现在“正在运行的应用程序”列表中)。

    现在我明白你在谈论一个网络应用程序,但这很重要。网页,我相信你也是这样,在手机中占用一些内存 - 你已经获得了DOM,所有的资源,关于状态的信息,以及页面的位置和小部件的设置。你说你的应用程序使用画布和东西相当互动 - 我相信它占用了大量的内存。

    因此,当您将Safari放入后台时,Safari很可能会摧毁您的内存缓存。

  2. Safari可以访问本地存储和cookie数据。 iOS5也可以访问WebSQL(但没有IndexedDB,因为WebSQL已经折旧了,所以这很可悲)。选择你的毒药。

  3. 您需要始终保存状态。由于您无法通过JS访问UIApplicationDelegate方法,因此每次用户执行某些操作时,都需要保存该状态更改。每次页面重新加载时,都需要检查持久状态并从您选择的存储选项中重新加载。

+0

是的,最小化=在后台运行。如果我要创建本机iPhone应用程序,JavaScript是否可以与本机ObjectiveC进行通信(反之亦然)?例如,如果我要使用'UIWebView'。我认为它应该很容易为iphone + android创建web应用程序,但似乎存在一些相当主要的缺陷。 –

+0

如果它在uiwebview中运行,它不是一个本地应用程序,这意味着你必须处理本机应用程序框架环境之外的事情。这很“容易”,但需要特别注意手机在应用程序中如何处理网络视图。 – tkone

+0

据推测'stringByEvaluatingJavaScriptFromString'可以用来执行UIWebView的上下文中的函数吗?因此,如果我每秒调用一次该函数,它可以检索一个操作名称/ params作为编码字符串,然后根据需要回复用户。这将允许来自Web视图内的JavaScript通知本地应用程序代码......或者是否有更好的方法。感谢您的见解 –

1

如果使用localStorage的API保存当前状态,并从负载此API恢复,你应该能够重新应用程序状态。

我建议这个页面的本地存储API的概述:http://diveintohtml5.info/storage.html

恐怕你会遇到麻烦防止在内存中的应用程序/网页时,它在后台运行,但连续存储状态的localStorage并在页面加载时恢复状态(window.onload或$(document).ready())将是一个解决方案。

0

如果您的应用只使用画布渲染,那么你可以绑定到window.unload或每当页面被卸载功能捕获使用画布的像素数据pagehide事件的功能

ctx.getImageData() 
  • 并将其存储在localstorage中,然后当页面重新加载时,您可以将该数据直接推送到画布以便即时重新加载,并在您将实际应用程序加载到它后面时放置一个微调器ontop。