ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

我启用了支持 apple-mobile-web-app 的元标记来隐藏 Safari 工具栏,我不想将其关闭。

所以你甚至没有碰一些可可,只是把链接保存到你的手机上?
@Tim Specht:不确定您的意思是什么,但 OP 询问的是网络应用程序,而不是本机应用程序。关于 SO 的相关问题:stackoverflow.com/questions/6686654/… - 不幸的是,这个问题也没有答案。
在此处查看我的答案:stackoverflow.com/a/40707231/473637
这是一个巨大的耻辱:-(
创建了这个小型反应模块,该模块将此信息保存在本地存储中,并在应用程序安装时重定向到上一个路由,这个问题今天仍然存在(github.com/diogofcunha/react-persist-route

C
Community

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

希望对您有所帮助。至少它对我有用,因为我和你有同样的问题。 :-)


@Crashalot问题一直持续到今天,并且暂时不会改变。
似乎根本不会有太大变化。然而,Android 最近通过 chrome 添加了改进的 webapp 体验,可以为您缓存状态。但那是一个不同的平台。
奇迹般地,这仍然是一个问题:O
我现在在 iOS 12.2 测试版中遇到了相反的行为。所以我想知道苹果是否正在调整一些东西。我发现的问题是,当您第二次启动 Web 应用程序时,没有运行任何脚本,因为它看起来好像只是显示了一个缓存视图。
@darren 那么判决是什么?现在我们有了 12.4,会发生什么?我们不能只提供缓存清单或使用某种网络工作者吗?或者这不适用于“添加到主屏幕”?您将这些应用程序称为“独立”什么?
A
Alastair

简短的回答是你无法控制这一点。有时 iOS 会在后台保持 Web 应用程序处于活动状态,有时它会杀死它。这完全与设备上有多少可用内存有关。

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


如果您充分离开应用程序并重新使用它,iOS 将始终无条件地终止全屏 Web 应用程序。例如,按下主页按钮显示主屏幕或切换到另一个应用程序将导致当您切换回全屏 web 应用程序时重新加载。唯一不会发生这种情况的情况是,如果您打开应用程序切换器(按两次主页按钮)并重新选择您的 web 应用程序而不是切换到另一个应用程序,在您的应用程序打开时锁定屏幕并直接解锁它,显示/隐藏控制面板,下拉和上推通知中心。
A
Artem Bernatskyi

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

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

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


W
Wilbo Baggins

更新:由于这个答案收到了反对票,我添加了这个解释。

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

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

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

在 iPhone 上的 Web 应用程序中维护 PHP 会话

iPhone“书签到主屏幕”删除 cookie 和会话?


我相信这里的问题略有不同。当您加载从主屏幕启动的页面时,它相当于单击加载 url 的书签,会话无关紧要。这将导致页面被重新加载并丢失状态,除非它以其他方式持久化和加载。
嗨,克里斯,就我而言,这是完美的。除了会话 cookie,我没有使用任何其他形式的本地存储或缓存,当我关闭并重新启动设备时,状态甚至会恢复。我只使用安装到主屏幕的网络应用程序。我的解决方案不适合你吗?
不,我有与 OP 相同的问题,并且必须实施基于 localStorage 的解决方案。我已使用您的解决方案来保持会话,但它对状态没有帮助,书签 URL 总是重新加载。我想知道是否可能还有其他区别?
当然,URL 总是会重新加载;这只是在应用程序切换(甚至重新启动设备)期间保持会话活动的一种方式。如果您不这样做,您的站点将无法记住您之前的会话;如果你这样做,你可以保留状态服务器端并始终恢复到它。显然,如果您真的想避免发出 http 请求,您将不得不使用某种形式的本地存储。
这不是最终的解决方案,它也只是修改 cookie……虽然有些人可能会在这里遇到变化,但很可能他们的服务器从一开始就没有设置用于生产。 -1 由于缺乏或研究/理解这个问题,并认为这个答案需要放在这个页面的底部。