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


70

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

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

我启用了启用apple-mobile-web-app-app的meta标签以隐藏Safari工具栏,但我不想将其关闭。


所以你甚至都没有碰到可可粉,只是把链接保存到手机上了?
Tim Specht

3
@Tim Specht:不确定您的意思是什么,但是OP正在询问有关Web应用程序而不是本机应用程序的问题。关于SO的相关问题:stackoverflow.com/questions/6686654/…-不幸的是,这个问题也没有答案。
–René

在这里查看我的答案:stackoverflow.com/a/40707231/473637
Jeshurun,

真是

创建这个小的反应模块,持续本地存储和重定向到以前的路线,当应用程序坐骑这个信息,这个问题是今日(相关仍然github.com/diogofcunha/react-persist-route
迪奥戈·库尼亚

Answers:


16

我刚刚在SO上发现了这个相关问题:在iOS上打开后,停止本地Web应用重新加载自身

似乎这是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
@Crashalot问题一直存在到今天,并且暂时不会改变。
ErwinGO,2014年

1
似乎根本不会改变太多。不过,Android最近通过chrome添加了改进的webapp体验,可为您缓存状态。但这就是一个不同的平台。
mix3d

2
奇迹般地,这仍然是一个问题:O
Pulsejet

我现在在iOS 12.2 Beta中遇到相反的行为。所以我想知道苹果是否正在调整事情。我发现的问题是,当您第二次启动Web应用程序时,没有脚本运行,因为它看起来好像它们只是显示缓存的视图一样。
达伦,

@darren那么判决是什么?现在我们有了12.4,会发生什么?我们不能只提供缓存清单还是使用某种网络工作者?还是对“添加到主屏幕”不起作用?您将这些应用称为“独立”吗?
格雷戈里·玛格沙克'19

1

我发现了一个黑客,在“iOS 11.4.1/12.0
打开文件上传”窗口中进行了测试,然后切换回主屏幕。
该应用仍然可以正常工作,在我看来,音频正在播放并且localStorage正在更新

证明:https : //youtu.be/heehLUhGKYY

PS。请注意当我们搜寻歌曲时进度如何变化,证明应用程序在后台运行


-1

简短的答案是您无法控制此操作。有时,iOS会在后台使某个Web应用处于活动状态,而在其他时候,它将杀死它。这完全与设备上的可用内存有关。

因此,最好的方法是最大程度地减少此重新加载所带来的问题。通过更改location.hash或使用,确保您的Web应用在视图之间移动时更新了URL history.pushState()。这将允许您在用户切换应用程序之前重新加载其所处的视图。有pagehidepageshow活动,让你当用户移动从您的应用程执行代码-利用这个机会来存储的localStorage和/或IndexedDB的本地状态,那么当Web应用被重新打开再次读取这些数据。


1
如果您足够离开应用程序并返回到该应用程序,iOS将始终无条件终止该应用程序。例如,按下主屏幕按钮以显示主屏幕或切换到另一个应用程序,将导致在您切换回全屏Web应用程序时重新加载它。唯一不会发生的情况是,如果您打开应用程序切换器(按两次主屏幕按钮)并重新选择您的Web应用程序,而不是切换到另一个应用程序,则在应用程序打开时锁定屏幕并直接将其解锁,显示/隐藏控制面板,然后向下和向上推动通知中心。
宾基

-1

更新:由于此答案正在接受投票,我添加了此解释。

您的问题可能不是实际的重新加载,而是Mobile Safari在通过浏览器打开Web应用程序时对用户缓存和cookie的处理方式有所不同,而不是将其作为Web应用程序“安装”到主屏幕时。尽管这里提出的使用localStorage的解决方案可以工作,但是它们对于客户端逻辑是很多工作,如果您的服务器已经负责保持用户的会话状态,则可以避免这些问题。30秒的解决方案是简单地将会话cookie设置为具有更长的生存期。

这使您即使在设备重新启动之间也可以保持状态不变,因此即使从主屏幕启动后从技术上讲它并不能阻止重新加载Web应用程序,这也是一种无需用户/即可为用户恢复状态的简便方法她注意到重新加载-在很多情况下,我怀疑这是真正的问题。


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


2
我相信这里的问题略有不同。当您加载从主屏幕启动的页面时,这等效于单击加载URL的书签,该会话无关紧要。除非页面以其他方式持久保存和加载,否则这将导致页面被重新加载并丢失状态。
克里斯·阿

克里斯,您好,就我而言,这一切正常。除了会话cookie之外,我没有使用任何其他形式的本地存储或缓存,并且在我关闭并重新启动设备后,状态甚至可以恢复。我仅使用安装到主屏幕的Web应用程序。我的解决方案对您不起作用吗?
Wilbo Baggins 2013年

1
不,我的问题与OP相同,必须实施基于localStorage的解决方案。我已经利用您的解决方案来持久化会话,但是它对状态没有帮助,带有书签的URL始终会重新加载。我想知道是否还会有其他差异?
克里斯(Chris

当然,URL总是被重载;这只是在应用程序切换(甚至重启设备)期间保持会话有效的一种方法。如果您不这样做,则您的站点将无法记住您之前的会话。如果这样做,则可以保留状态服务器端并始终将其还原到该状态。显然,如果您确实想避免执行http请求,则必须使用某种形式的本地存储。
Wilbo Baggins 2013年

这不是最终的解决方案,它也只是修改cookie。虽然有些人可能会在这里遇到更改,但很可能反正他们的服务器从一开始就没有设置用于生产。-1是由于对此问题的缺乏或研究/理解,认为此答案需要坐在此页面的底部。
生气
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.