【问题标题】:iPhone WebApp on Home Screen Persistence主屏幕持久性上的 iPhone WebApp
【发布时间】:2011-12-20 08:09:29
【问题描述】:

我创建了一个可以保存到 iPhone 上的“主屏幕”的 web 应用程序。该应用程序使用画布,并且与不断变化的状态相当互动。

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

  1. 当应用程序被最小化时,如何防止重新加载?

  2. 持久化状态数据的最佳方式是什么 关闭并重新打开它继续无缝?

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

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

【问题讨论】:

    标签: javascript android iphone html web-applications


    【解决方案1】:

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

    1. 定义最小化?在后台运行?

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

      这就是为什么您在构建 iOS 应用时拥有:

      - (void)applicationWillTerminate:(UIApplication *)application

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

      现在我知道您说的是网络应用,但这很重要。网页,我相信你的网页也会占用手机中的一些内存——你有 DOM、所有资源、关于页面在哪里以及哪些小部件设置为什么的状态信息。你说你的应用使用画布和其他东西是相当可交互的——我敢肯定它会占用大量内存。

      因此,当您将 Safari 置于后台时,Safari 很可能会破坏您的内存缓存。

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

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

    【讨论】:

    • 是的,最小化 = 在后台运行。如果我要创建一个原生 iPhone 应用程序,JavaScript 是否可以与原生 ObjectiveC 通信(反之亦然)?例如,如果我要使用UIWebView。我认为为 iphone + android 创建网络应用程序应该很容易,但似乎存在一些相当大的缺陷。
    • 如果它在 uiwebview 中运行,它不是原生应用程序,这意味着您必须在原生应用程序框架的上下文之外处理事情。这很“简单”,但需要特别注意手机如何处理应用程序中的网络视图。
    • 大概stringByEvaluatingJavaScriptFromString 可以用来在 UIWebView 的上下文中执行函数?因此,如果我每秒调用一次该函数,它可以检索动作名称/参数作为编码字符串,然后根据需要响应用户。这将允许 Web 视图中的 JavaScript 通知本机应用程序代码......或者有更好的方法。感谢您的洞察力,谢谢
    【解决方案2】:

    如果您使用 localStorage API 保存当前状态并在加载时从该 API 恢复,您应该能够重新创建应用程序状态。

    我推荐这个页面来了解本地存储 API:http://diveintohtml5.info/storage.html

    恐怕你会在后台阻止应用程序/网页在内存中出现问题,但会在页面加载时不断将状态存储到 localStorage 并恢复状态(window.onload 或 $(document).ready ()) 将是一个解决方案。

    【讨论】:

      【解决方案3】:
      1. 我不认为你可以
      2. WebKit 支持 HTML5 客户端数据存储,您可以使用它
      3. 我不知道您的 webApp 会以何种方式在关闭时收到通知,因此您应该尝试在导航等的每个步骤之后保存当前状态 (Background behavior for iOS Web App (so app doesn't restart))。

      【讨论】:

        【解决方案4】:

        如果您的应用仅使用画布进行渲染,那么您可以将函数绑定到 window.unload 或 pagehide 事件,每当卸载页面时,该函数使用

        捕获画布的像素数据
        ctx.getImageData()
        
        • 并将其存储在本地存储中,然后在重新加载页面时,您可以将该数据直接推送到画布以实现近乎即时的重新加载,并在加载实际应用程序时在其顶部放置一个微调器。

        【讨论】:

          猜你喜欢
          • 2011-01-29
          • 2011-03-26
          • 1970-01-01
          • 2012-05-07
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多