如何避免本地 Web 应用程序数据被删除?

Posted

技术标签:

【中文标题】如何避免本地 Web 应用程序数据被删除?【英文标题】:How to avoid local web app data being erased? 【发布时间】:2020-08-24 08:53:39 【问题描述】:

我们希望我们的网络应用可以离线使用,主要是在移动设备上。我们已经为此编写了代码,使用了 service worker。应用程序数据存储在 IndexedDb 中,应用程序代码(html、js、css 等)存储在 SW 缓存中。到目前为止,一切都很好。我们知道用户可以删除浏览器缓存和我们的数据,这不是问题。但是浏览器本身擦除应用数据呢?我们还没有找到一个全面的规范,我们找到的主要信息是:

1) 目前标记为“实验性”的StorageManager 功能(自 2016 年起);

2) 来自 Google here 的一篇关于它的短文(同样来自 2016 年)。

代码示例如下:

if (navigator.storage && navigator.storage.persist)
  navigator.storage.persist().then(granted => 
    if (granted)
      alert("Storage will not be cleared except by explicit user action");
    else
      alert("Storage may be cleared by the UA under storage pressure.");
  );

谷歌文章说:

当本地计算机上的存储空间紧张时(“存储不足 压力”),用户代理自动清除存储以使更多 可用空间。当然,对于离线应用来说,这可能是不幸的, 因为他们可能尚未将数据同步到服务器,或者他们可能 是用户希望离线工作的应用程序(如音乐 播放器);所以存储规范定义了两种不同的存储模式 对于给定的域 - “尽力而为”和“持久”。默认模式, 当然是“尽力而为”。存储“最佳”的域 努力”(又名“不持久”)可以自动清除,无需 打断或询问用户。但是,“持久”数据不会 被自动清除。 (如果系统仍在存储中 清除所有非持久数据后的压力,用户将需要 手动清除任何剩余的持久存储。)

...

从 Chrome 55 开始,Chrome 会自动授予持久性 如果以下任何一项为真,则许可:

网站已添加书签(用户拥有 5 个或更少的书签) 该网站的网站参与度很高 网站已添加到主屏幕 网站启用了推送通知

在所有其他情况下,该权限会自动被拒绝。

目标是确保用户可以依赖他们喜爱的网络应用 并没有发现他们突然被清除了。

这是针对 Chrome 55 的,我们假设信息是最新的。乍一看,他们的目标听起来很合理,但如果您仔细观察,该实现是针对“大型”网站(类似于 Google),而不是针对更面向任务的小众应用程序。

确实,在 Chrome 80+ 上测试各种 android 手机时,持久性总是被拒绝,没有用户交互。所以,“尽力而为”。

我们本可以在这里停止调查并收工。毕竟,目前的手机和 PC 的存储量非常大,而我们只使用了几百 KB,所以我们应该没问题。问题是,我们不是:在带有 Chrome 的全新旗舰 Android 手机上进行测试,我们的代码只需要几秒钟的摆弄就被删除(关闭和打开页面几次就足够了)。在其他平台上有所不同,但 Android+Chrome 将得到最多使用。

奇怪的是,只有 SW 缓存 (

只有我们一个人有这个问题吗?如果没有,你们是怎么处理的?

额外问题:是否有更多关于该主题的最新文档?

【问题讨论】:

一些网站(不仅是可疑网站)强制 Chrome 存储数据的两种方式:(1)反复要求用户将网站添加到主屏幕和/或启用推送通知 -甚至可能在虚假标志下(“安装我们的应用程序”本质上是移动设备上的全屏 Chrome 实例)(2)提供Chrome extension 并在那里存储东西。鉴于您的报价,我终于明白了这样做的目的。 谢谢@B--rian yes (1) 是一种选择,但它对用户来说很麻烦,所以我们宁愿不这样做。此外,Google 可以随时更改该政策而不会发出警告,因为它不是网络标准。 (2) 在我们的情况下不实用,我们希望避免任何用户安装 @Ilya,你能指定“软件缓存( @Ilya,我正在使用 PWA,但从未遇到过您的问题。您是否可以提供可重现的最小代码和环境? @John 环境是任何带有 Chrome 80+ 的 Android 手机,一个带有缓存但没有安装/书签的软件,例如操作是关闭/重新打开 Chrome 两次 【参考方案1】:

如果我的理解正确,主要问题是 Android 上的 Chrome 浏览器不断清空浏览器缓存,以获取不满足 Chrome 条件的网站自动授予持久性权限

到目前为止,我还没有遇到这种情况,但我观察到了这种行为,你引用了https://developers.google.com/web/updates/2016/06/persistent-storage - 我只是到目前为止还不知道它明确记录了。

我看到一些网站强制用户数据持久存储的三种方式:

    反复要求用户将网站添加到主屏幕和/或启用推送通知。我观察到此请求通常以某种方式在虚假标志下出现,即某事作为“订阅通知以表达你的感激之情”而不是“我们是否允许持久存储数据”“安装我们的应用程序” 甚至可能意味着将全屏 Chrome 实例添加到移动设备的主屏幕,而不是应用商店中的真实应用程序。

    一些网站提供 Chrome 扩展程序,允许他们在那里存储内容,甚至获得更多访问权限。我个人不建议采用这种方法,它会以某种方式给具有安全意识的用户带来一种奇怪的感觉。

    另一种选择是一种混合方法,您提供一个本机应用程序,实际上只是一个定制的浏览器。如果乍一看这听起来很奇怪,请耐心等待我。这个选项实际上很容易获得,例如在 React Native 中为 react-native-webbrowser component。这显然需要编程工作,但似乎有不少新闻网站使用这种方法。

选项 1 和 2 都使用 Chrome,但显然不适合您,因为您只是想避免打扰用户。

选项 3 是非常规的,但可能是一个值得考虑的选项。只有身为程序员的用户可能会意识到他们在安装本质上只是一个浏览器的东西时有点被愚弄了。尽管如此,它确实是一个干净的解决方案:应用商店负责访问权限控制,而您可以让用户完全选择如何处理数据。

【讨论】:

很高兴知道,作为通常情况下的解决方法。对我们来说,只有第一个选项是可行的,即使这样也会降低用户体验。我们通过 SMS 发送网址以供临时使用,通常是一两天。

以上是关于如何避免本地 Web 应用程序数据被删除?的主要内容,如果未能解决你的问题,请参考以下文章

AWS EC2避免误删软件包和数据的方法:取消“终止删除”默认配置

如何避免localStorage存储的值被修改

保护和取消保护文件以避免在 Android 中被错误的清理应用程序意外删除

如何找出 CloudKit 订阅何时被删除?

如何删除并重新创建由 mock api 创建的本地 dynamodb/appsync/amplify 数据库?

如何在浏览器本地存储 Flutter Web 应用程序中保存对象列表