-->

iOS版“Web应用程序”具有不同的localStorage比移动Safari浏览器(iOS 

2019-06-26 08:59发布

我已经为iPad与meta标签web应用程序:

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

当我在移动Safari浏览器的地址打开从主页(web-app的功能的版本)或类型的应用程序的localStorage的内容是不同的。 我已经证实,地址是通过打印location.href相同。

而使用移动Safari浏览器的localStorage的所有变化都体现在网络应用功能的版本,但在web应用程序功能的版本所做的更改不会反映在移动Safari浏览器版本。

域是相同的,localStorage的应该是相同的。 世界到底是怎么回事? 这个问题能解决吗?


更新-解决方法 :从接受的答案提出以下建议#2(强制用户在全屏模式下),我说的这段代码:

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

所以,如果你使用的是支持单机模式下的浏览器,你是不是在独立模式下,重定向到一个页面(instructions.html),这显示了用户如何将应用程序添加到主屏幕。

谢谢大家的意见!

Answer 1:

摘要:

Safari和全屏的网络应用程序(也称为web应用功能的),由于具有localStorage的数据的单独的内存写通高速缓存。 每次全屏应用程序被激活时,它从磁盘再次装入(允许它看到Safari的变化)的localStorage的。 然而,当Safari浏览器被激活,它不会从磁盘重新装载数据的localStorage,所以不会看到,除非你杀了Safari浏览器并重新启动它在全屏幕应用程序所做的更改。

充分的解释:

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

  1. 缓存失效
  2. 事物命名
  3. 关闭的情况的一个错误

在localStorage的的错误行为是问题#1的结果。 这是因为:

当iOS的浏览器引擎的负荷,它从磁盘读取localStorage的数据,并在内存中缓存它。 然后每次读出的数据(例如,时间getItem ),该数据被从存储器中读出,而不是从盘; 和写入时(例如setItem )的数据被写入到存储器中,然后(异步地)刷新到磁盘。 由于localStorage的是同步的,因此这种做法完全合理的。 如果去到磁盘的所有读取和写入,你的JavaScript将被阻止在每次读/写操作进行昂贵的磁盘IO。

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

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

这里是幕后...

  1. 用户使得在Safari浏览器的数据写入到localStorage的变化
  2. Safari浏览器将数据写入到Safari浏览器的内存中缓存的localStorage
  3. Safari浏览器从缓存中刷新localStorage的数据到磁盘
  4. 用户离开Safari和启动FSWA
  5. FSWA负载和从盘读取数据的localStorage到内存中缓存
  6. 用户看到被在Safari改变(在步骤#1)的数据
  7. 用户在该FSWA的变化,为localStorage的写入数据
  8. FSWA将数据写入其localStorage的缓存(Safari浏览器的缓存中没有更新)
  9. FSWA刷新其localStorage的缓存数据到磁盘
  10. 用户切换回的Safari
  11. Safari浏览器已经在运行,它不会从磁盘重新装载数据的localStorage
  12. Safari浏览器从现有的内存缓存中读取旧数据
  13. 用户不会看到在步骤#7的更改

为了证明这一点,你可以杀了Safari浏览器的步骤#4和步骤#10之间。 然后,当你在步骤#11重新启动Safari浏览器,它会重新从磁盘localStorage的,你会看到由FSWA写入的数据。



Answer 2:

在iOS5中我能对同一域中的两个全屏网络应用程序能够看到对方的localStorage的。 这克服了全屏和Safari浏览器之间的差异。

然而,随着iOS6的我有我的两个全屏幕Web应用程序合并到一个应用程序。



Answer 3:

假设你正确保存本地存储数据,如果我没有记错,你体验到什么是一个有些 web应用程序开发人员之间的共同问题 。 饼干,会话和本地存储似乎以不同方式存储在“Web应用程序”(从主屏幕发起)到通过移动Safari浏览器中保存的数据。

我已经做了一些这方面的比较透彻testings在过去, 在我看来,有没有解决方法不够好 。 只给你在哪里我的同事和我都面临着类似的问题的例子:在一个web应用程序,我们最近开发的,用户访问其所有功能之前登录。 如果一个人通过移动Safari浏览器登录,然后切换到该应用程序的下载版本,一个希望先登录但这并非总是如此。 人们通常必须重新登录,提示的cookie可以被存储在不同的“数据银行”,这取决于如何或者你在哪里选择启动应用程序。

此外,由于加尔文说, 还有比只是不同银行的数据,因为它是更多的东西 。 通过主屏幕启动应用程序看起来好像是打开速度比较慢,启动提示没有多任务支持时,主屏幕应用程序始终是重载,等我的结论:程序启动下载的Web应用程序=野生动物园减去地址栏,因此不应该被如此对待。

虽然苹果公司一个很好的功能 ,主屏幕web应用程序不太如预期或执行正如人们所期望(比如,因为它在Safari中打开。)在你的情况,假设你正确地存储数据的LS,并尝试不同的方法来解决您的具体问题, 我建议以下备选方案之一:

  1. 使用MySQL数据库,以R / W自/至代替
  2. 强制用户 (像使用它之前下载的应用程序 这个例子中 )
  3. 不要鼓励用户下载应用 ,并承担其中大部分将来自移动Safari浏览器访问
  4. 接受这个事实 ,数据可能会有所不同(这可能不是您根据您的应用程序的性质替代)
  5. 就拿我的做法,“转换”你的web应用程序通过本机应用程序 的PhoneGap的内置功能。 如果是这样,看看本教程由乔纳森·斯塔克。

希望这有助于澄清它至少部分。



文章来源: iOS 'Web App' has different localStorage than Mobile Safari