停止 iPhone 主屏幕启动的 Web 应用程序重新加载

70

我创建了一个Web应用并将其添加到我的iPhone主屏幕上。当我切换到另一个应用程序并返回时,iPhone会自动重新加载我的Web应用程序。这破坏了我的应用程序流程。

我该如何防止iPhone重新加载应用程序?

我启用了apple-mobile-web-app-capable元标签以隐藏Safari工具栏,并且不想关闭它。


那么你甚至没有接触过Cocoa的一些部分,只是将链接保存到了手机上? - Tim Specht
3
@Tim Specht: 我不确定你的观点是什么,但OP正在询问一个Web应用程序,而不是本地应用程序。相关问题请参考SO:https://dev59.com/questions/Dmw15IYBdhLWcg3wVKJ1 - 不幸的是,该问题也没有答案。 - René
请查看我的答案:https://dev59.com/WW865IYBdhLWcg3wcOLG#40707231 - Jeshurun
这真是一个巨大的遗憾 :-( - Simon_Weaver
我创建了一个小的React模块,它将信息持久化到本地存储,并在应用程序挂载时重定向到先前的路由。这个问题今天仍然很重要。(https://github.com/diogofcunha/react-persist-route) - Diogo Cunha
4个回答

16

我刚在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

希望这能对您有所帮助。至少对我来说是这样的,因为我曾经遇到过与您相同的问题。:-)


4
这个问题如今仍然存在,而且短时间内不会有改变。 - goerwin
1
似乎不会有太大变化。然而,Android 最近通过 Chrome 添加了一个改进的 Web 应用体验,可以为您缓存状态。但这是不同的平台。 - mix3d
2
神奇的是,这仍然是一个问题 :O - pulsejet
我现在在iOS 12.2 beta中遇到了相反的行为。所以我想知道苹果是否在调整一些东西。我发现的问题是,当您第二次启动Web应用程序时,不会运行任何脚本,因为它们似乎只显示缓存视图。 - Darren
@Darren 那是否意味着,在最新版本的iOS中,重新加载问题已经得到解决? - André Reichelt
显示剩余3条评论

0

更新:由于这个答案正在受到负面评价,我添加了这个解释。

你的问题可能不是实际的重新加载,而是当你的 Web 应用程序通过浏览器打开时,移动 Safari 处理用户缓存和 cookie 的方式与将其“安装”为 Web 应用程序到主屏幕时不同。虽然在此处提出使用 localStorage 的解决方案将起作用,但对于可以避免客户端逻辑的大量工作,如果您的服务器已经负责持久化用户会话状态,则可以避免这种情况。30 秒的解决方案就是简单地显式设置会话 cookie 的寿命更长。

这使您能够在设备重新启动之间保持状态完整,因此即使从主屏幕启动时它并不能从技术上停止 Web 应用程序的重新加载,但这是一种轻松的方法来为用户恢复状态,而不会让他/她注意到重新加载 - 在许多情况下,我认为这才是真正的问题。


关于这种策略和代码示例的更详细讨论,请查看以下问题及我的回答:


2
我认为这里的问题略有不同。当您从主屏幕加载页面时,它相当于点击一个书签来加载URL,会话是无关紧要的。这将导致页面重新加载并且状态丢失,除非它被持久化并以其他方式加载。 - Chris A
嗨,Chris,就我的情况而言,这个方案完美地运作着。我没有使用任何形式的本地存储或缓存,除了会话 cookie 之外,状态甚至在我关闭并重新启动设备之间也得以恢复。我只是使用安装到主屏幕的 Web 应用程序。我的解决方案对你不起作用吗? - Wilbo Baggins
1
不,我和楼主有同样的问题,不得不实现一个基于localStorage的解决方案。我已经使用了你的解决方案来保持会话,但它并不能帮助状态,书签URL总是重新加载。我想知道是否可能还有其他区别? - Chris A
当然,URL总是重新加载的;这只是在应用程序切换(甚至重新启动设备)期间保持会话活动的一种方式。如果您不这样做,您的网站就没有办法记住您之前的会话;如果您这样做,您可以将状态保存在服务器端并始终恢复到该状态。显然,如果您真的想避免进行http请求,您将不得不使用某种形式的本地存储。 - Wilbo Baggins
这不是一个万能解决方案,只是修改了一个cookie而已... 虽然有些人可能会在这里体验到一些变化,但很可能他们的服务器从一开始就没有为生产环境进行设置。由于缺乏对此问题的研究/理解,并认为这个答案需要放在页面底部,因此评分为-1。 - Angry 84
感谢您的评论Mayhem。您说得对,正如答案开头所明确说明的那样,这并不能阻止Web应用程序重新加载。但是对于寻找阻止强制重新加载困扰其用户的服务器端应用程序开发人员来说,持久化会话Cookie可能是一个有价值的解决方法。对我而言,这很重要,比使用本地存储实现真正的非重新加载解决方案容易得多。 - Wilbo Baggins

0

我发现了一个黑客技巧,测试过在上可行。
打开文件上传窗口,然后切换回主屏幕。
应用程序仍然可以继续工作,在我的情况下音频正在播放并且localStorage正在更新。

Proofs: https://youtu.be/heehLUhGKYY

注意:当我们搜索时,观察歌曲进度如何变化,这证明应用程序在后台运行。


0

简短的回答是你无法控制这个问题。有时iOS会在后台保持Web应用程序处于活动状态,而有时它会将其关闭。这完全取决于设备上可用的内存。

因此,你最好的方法是尽量减少重新加载带来的问题。确保你的Web应用程序在从一个视图到另一个视图时更新URL,可以通过更改location.hash或使用history.pushState()来实现。这将允许你重新加载用户在切换应用程序之前所在的任何视图。有pagehidepageshow事件可以让你在用户离开你的应用程序时执行代码-利用这个机会在localStorage和/或IndexedDB中存储本地状态,然后在Web应用程序重新打开时再次获取这些数据。


1
如果你离开iOS全屏Web应用程序并返回它,无论何时都会无条件地将其关闭。例如,按Home键显示主屏幕或切换到另一个应用程序都会导致全屏Web应用程序在切换回来时重新加载。唯一不会发生这种情况的时间是,如果你打开应用程序切换器(按两次Home键)并重新选择你的Web应用程序而不是切换到另一个应用程序,锁定屏幕而你的应用程序处于打开状态,并直接解锁它,显示/隐藏控制面板,以及下拉和推上通知中心。 - binki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接