iOS'Web App'具有与Mobile Safari不同的localStorage

我有一个带meta标签的iPad的webapp:

<meta name="apple-mobile-web-app-capable" content="yes">

当我从主页(支持网页应用程序的版本)打开应用程序或在Mobile Safari中输入地址时,localStorage的内容不同。 我已经通过打印location.href确认地址是相同的。

移动Safari浏览器对localStorage进行的所有更改都反映在支持Web应用程序的版本中,但支持Web应用程序的版本所做的更改未反映在Mobile Safari版本中。

域是相同的,localStorage应该是相同的。 世界正在发生什么? 这可以解决吗?


更新 - 解决方案 :从接受的答案(迫使用户进入全屏模式)的建议#2我添加了这一点的代码:

if(("standalone" in window.navigator) && !window.navigator.standalone)
    window.location = "instructions.html";

因此,如果您使用的是支持独立模式的浏览器,并且您没有处于独立模式,请将其重定向到一个页面(instructions.html),该页面向用户显示如何将该应用添加到主屏幕。

感谢大家的意见!


概要:

Safari和全屏Web应用程序(又名支持Web应用程序)具有单独的内存直写缓存localStorage数据。 每次全屏应用程序变为活动状态时,它都会从磁盘重新加载localStorage(允许它查看Safari的更改)。 但是,当Safari变为活动状态时,它不会从磁盘重新加载localStorage数据,因此它不会看到全屏应用程序中所做的更改,除非您杀死Safari并重新启动它。

完整说明:

计算机科学只有两个难题:

  • 缓存失效
  • 命名的东西
  • 逐个错误
  • localStorage中的错误行为是问题#1的结果。 原因如下:

    当iOS浏览器引擎加载时,它从磁盘读取localStorage的数据并将其缓存在内存中。 然后每次读取数据(例如getItem )时,数据都从内存中读取,而不是从磁盘读取; 在写入数据(例如setItem )时,数据被写入内存,然后(异步)刷新到磁盘。 由于localStorage是同步的,所以这个实现是完全合理的。 如果它进入磁盘进行所有读写操作,那么您的JavaScript将在每次读/写操作时被阻止,以执行昂贵的磁盘IO。

    问题是,全屏Web应用程序(我们称之为FSWA)使用iOS浏览器引擎的单独实例,虽然FSWA在localStorage数据上共享磁盘上的相同位置,但它不共享内存缓存使用Safari的localStorage数据。

    当您添加事实FSWA完全重新加载(这意味着localStorage数据从磁盘重新加载)每次他们成为活动应用程序时,您会看到您所看到的行为。

    这是幕后...

  • 用户进行更改,将数据写入Safari中的localStorage
  • Safari将数据写入Safari的内存localStorage缓存
  • Safari将localStorage数据从缓存刷新到磁盘
  • 用户离开Safari并启动FSWA
  • FSWA从磁盘加载并读取localStorage数据到内存中缓存中
  • 用户将看到Safari中已更改的数据(步骤#1)
  • 用户在将数据写入localStorage的FSWA中进行更改
  • FSWA将数据写入本地存储缓存(Safari的缓存未更新)
  • FSWA将其本地存储缓存数据刷新到磁盘
  • 用户切换回Safari
  • Safari已经在运行,并且不会从磁盘重新加载localStorage数据
  • Safari从其现有的内存缓存中读取旧数据
  • 用户看不到在步骤#7中所做的更改
  • 为了证明这一点,您可以在步骤#4和步骤#10之间杀死Safari。 然后,当您在步骤#11中重新启动Safari时,它将从磁盘重新加载localStorage,您将看到由FSWA写入的数据。


    在iOS5中,我能够在同一个域中有两个全屏Web应用程序,它们能够看到彼此的localStorage。 这克服了全屏和Safari之间的差异。

    但是,在iOS6中,我不得不将两个全屏Web应用程序合并到一个应用程序中。


    假设您正确保存本地存储数据,并且如果我没有弄错,那么您遇到的问题在Web应用程序开发人员中是一个常见问题 。 Cookies,会话和本地存储在“网络应用程序”(从主屏幕启动)中似乎以不同方式存储到通过移动Safari浏览器保存的数据中。

    过去我已经做了一些相当彻底的测试,在我看来,没有任何解决方法够好 。 举个例子,我的同事和我遇到过类似的问题:在我们最近开发的一个Web应用程序中,用户必须先登录才能访问其所有功能。 如果通过移动Safari浏览器登录,然后切换到下载的应用程序版本,则预计会登录,但情况并非总是如此。 通常需要再次登录,这表明cookie可能存储在不同的“数据库”中,具体取决于您选择启动应用程序的方式或方式。

    此外,正如加尔文所说,除了不同的数据库之外,还有更多不同之处。 通过主屏幕启动的应用程序似乎打开速度更慢,启动时总是重新加载主屏幕应用程序,提示没有多任务支持等。 我的结论:程序启动下载的网络应用程序!= safari减去地址栏,因此不应该这样对待。

    虽然Apple提供了一个很好的功能,但主屏幕网络应用程序并不像预期的那样运行,也不像人们希望的那样运行(就像在safari中打开一样)。在您的情况下,假设您正确存储LS数据并尝试了不同的方法来修复特别的问题, 我会建议以下方法之一:

  • 使用mysql数据库来从/到r / w代替
  • 强制用户在使用之前下载应用程序 (如本例中所示)
  • 不要鼓励用户下载该应用程序,并假设其中大部分将从移动Safari浏览器访问
  • 接受数据可能不同的事实 (根据应用的性质,这可能不是您的替代方案)
  • 以我的方法,通过Phonegap的内置功能将您的网络应用程序“转换”为本机应用程序 。 如果是这样,请看Jonathan Stark撰写的这篇教程。
  • 希望这有助于澄清至少部分内容。

    链接地址: http://www.djcxy.com/p/90931.html

    上一篇: iOS 'Web App' has different localStorage than Mobile Safari

    下一篇: FB.login broken flow for iOS WebApp