我创建了一个网络应用程序并添加到我的 iPhone 主屏幕。当我切换到另一个应用程序并返回时,iPhone 会自动重新加载我的网络应用程序。这打破了我的应用程序流程。
如何防止 iPhone 重新加载应用程序?
我启用了支持 apple-mobile-web-app 的元标记来隐藏 Safari 工具栏,我不想将其关闭。
我刚刚在 SO 上找到了这个相关问题:Stop native web app from reloading itself upon opening on iOS
由于这似乎是 Safari 的一个限制,建议的解决方案是使用 Javascript 和 HTML5 localStorage 保持您的 Web 应用程序状态。当您的 Web 应用程序启动时,检查持久状态并加载它(如果可用)。
您可以在此处阅读有关在 Safari 中使用 localStorage 的信息:http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007256-CH1-SW1
希望对您有所帮助。至少它对我有用,因为我和你有同样的问题。 :-)
简短的回答是你无法控制这一点。有时 iOS 会在后台保持 Web 应用程序处于活动状态,有时它会杀死它。这完全与设备上有多少可用内存有关。
因此,您最好的方法是尽量减少此重新加载带来的问题。通过更改 location.hash
或使用 history.pushState()
,确保您的 web 应用程序在您从一个视图移动到另一个视图时更新 URL。这将允许您重新加载用户在切换应用程序之前打开的任何视图。有 pagehide
and pageshow
events 允许您在用户离开您的应用程序时执行代码 - 借此机会将本地状态存储在 localStorage 和/或 IndexedDB 中,然后在重新打开 web 应用程序时再次获取该数据。
我发现了一个 hack,在 iOS 11.4.1/12.0
打开文件上传窗口然后切换回主屏幕上进行了测试。
应用程序仍然可以继续工作,在我的情况下,音频正在播放并且 localStorage
正在更新
证明:https://youtu.be/heehLUhGKYY
PS。注意我们搜索时歌曲进度如何变化,这证明应用程序在后台运行
更新:由于这个答案收到了反对票,我添加了这个解释。
您的问题可能不是实际的重新加载,而是当您的 Web 应用程序通过浏览器打开时,Mobile Safari 对待用户缓存和 cookie 的方式与将其作为 Web 应用程序“安装”到主屏幕时不同。尽管这里提出的使用 localStorage 的解决方案可以工作,但如果您的服务器已经负责保持用户的会话状态,则可以避免这些工作量很大。 30 秒的解决方案是简单地显式设置会话 cookie 以具有更长的生命周期。
这使您即使在设备重新启动之间也能保持状态不变,因此即使从技术上讲它不会阻止从主屏幕启动时重新加载 Web 应用程序,但它是一种为没有他的用户恢复状态的简单方法/她注意到重新加载 - 在许多情况下,我怀疑这是真正的问题。
有关此策略和代码示例的更详细讨论,请查看这些问题和我的答案:
在 iPhone 上的 Web 应用程序中维护 PHP 会话
iPhone“书签到主屏幕”删除 cookie 和会话?
不定期副业成功案例分享