- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我有一个带有元标记的 iPad 网络应用程序:
<meta name="apple-mobile-web-app-capable" content="yes">
当我从主页(支持网络应用程序的版本)打开应用程序或在 Mobile Safari 中输入地址时,localStorage 的内容不同。我已通过打印 location.href 确认地址相同。
在使用 Mobile Safari 时对 localStorage 所做的所有更改都会反射(reflect)在支持 Web 应用程序的版本中,但在支持 Web 应用程序的版本中所做的更改不会反射(reflect)在 Mobile Safari 版本中。
域是相同的,localStorage 应该是相同的。这到底是怎么回事?这可以修复吗?
更新 - 解决方案:根据接受的答案中的建议 #2(强制用户处于全屏模式),我添加了这段代码:
if(("standalone" in window.navigator) && !window.navigator.standalone)
window.location = "instructions.html";
因此,如果您使用的是支持独立模式的浏览器,并且您未处于独立模式,请重定向到一个页面 (instructions.html),该页面向用户展示如何将应用程序添加到主屏幕。
感谢大家的投入!
最佳答案
总结:
Safari 浏览器和全屏网络应用程序(也称为支持网络应用程序)具有单独的本地存储数据内存直写缓存。每次全屏应用程序激活时,它都会从磁盘重新加载 localStorage(允许它看到 Safari 的更改)。但是,当 Safari 激活时,它不会从磁盘重新加载 localStorage 数据,因此除非您终止 Safari 并重新启动它,否则它不会看到在全屏应用程序中所做的更改。
完整说明:
计算机科学中只有两个难题:
localStorage 中的错误行为是问题 #1 的结果。原因如下:
当 iOS 浏览器引擎加载时,它会从磁盘读取 localStorage 的数据并将其缓存在内存中。然后每次读取数据(例如getItem
)时,数据都是从内存中读取的,而不是从磁盘中读取的;并且在写入(例如 setItem
)时,数据被写入内存,然后(异步)刷新到磁盘。由于 localStorage 是同步的,所以这个实现是完全合理的。如果它去磁盘进行所有读写,你的 javascript 将在每次读/写时被阻塞以执行昂贵的磁盘 IO。
问题是全屏网络应用程序(让我们称之为 FSWA)使用 iOS 浏览器引擎的单独实例,尽管 FSWA 共享磁盘上的相同位置以存储 localStorage 数据,但它不会与 Safari 共享 localStorage 数据的内存缓存。
当您添加 FSWA 每次成为事件应用程序时完全重新加载(这意味着 localStorage 数据从磁盘重新加载)这一事实时,您就会得到您所看到的行为。
这是幕后...
为了证明这一点,你可以kill Safari在步骤#4 和步骤#10 之间。然后,当您在步骤 #11 中重新启动 Safari 时,它将从磁盘重新加载 localStorage,您将看到 FSWA 写入的数据。
关于iOS 'Web App' 的 localStorage 与 Mobile Safari 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545149/
我是 Angular 新手。使用 $localstorage(ngStorage) 是否有任何特定的原因而不是常规的 javascript localstorage 有什么区别。 谁能给我解释一下吗?
这个问题说明了一切。我意识到所有选项都可以在最新的浏览器中使用,但是语义上最好的选择是什么?为什么? 最佳答案 根据 W3C 标准,正确的是 window.localStorage,因为 localS
我想不出一个好的标题,所以希望可以。 我正在做的是创建一个离线 HTML5 webapp。 “出于某些原因”我不希望将某些文件放在缓存 list 中,而是希望将内容放在 localStorage 中。
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我最近问了a question about LocalStorage .使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我最近问过a question about LocalStorage 。使用 JSON.parse(localStorage.item) 和 JSON.parse(localStorage['item
我在将本地存储的定价添加到其他字段时遇到问题。如果我将 beforeNoonNPSlot 的价格设置为 2,但我将 matineeNPSlot 的字段留空(它应该保留分配给的任何价格)最后)。然后在我
我需要从 localStorage 对象变量中删除对象键而不从 localStorage 中删除键 let obj = localStorage; let keys = Object.keys(loc
根据我所读到的内容,我希望以下代码能够工作。 此代码是函数的一部分,该函数应该通过用下一个更高的 localStorage 变量覆盖它来删除 localStorage 变量。一旦没有更多内容可供复制,
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: JavaScript property access: dot notation vs. brackets? 我是
编写localStorage['key'] = value或localStorage.setItem('key', value)有区别吗? 我看到了this question标记为重复,但在开发人员工
我一直在做以下事情: var store = window.localStorage; store.setItem() 但现在我看到代码是这样做的: localStorage.setItem() 两者
我在 Chrome 上遇到此错误。不知道为什么会发生。任何帮助!我正在使用 Backbone.localStorage 插件和 Backbone。我在以下行中收到错误: localStorage: B
如果我尝试以下代码: var c = new Backbone.Collection(); c.localStorage = new Backbone.LocalStorage("items");
我想使用 localStorage 存储用户输入值,然后在倒计时器中使用该值。 这是用户输入数据的 HTML: Work Time
我有一个适用于 Mac 和 Linux 用户但不适用于 Windows 用户的 Chrome 扩展程序。当我进入控制台并在 localStorage 中设置一个项目时,它工作正常,但是当用户尝试使用扩
在这里浏览所有问题/答案,但找不到解决我的问题的方法。条件('localStorage' in window)返回 true但是 localStorage 的对象本身仍然是 undefined . 设
使用下面的代码,我创建一个 localstorage 变量,如果未定义,则其键为 quote = 1。然而,当最终使用相同的引号键再次调用它时,即使使用了 Number() 函数,它也会变成 11 而
我上次检查时,以下两行返回 true: null == localStorage["foo"]; null == localStorage.getItem("foo"); 将 null 替换为 und
我正在尝试在 NextJS 静态站点上使用 localStorage,但遇到 localStorage 未定义错误。 我的错误显示组件的代码是: export default function Cat
我是一名优秀的程序员,十分优秀!