【发布时间】:2023-03-17 21:20:02
【问题描述】:
我目前正在为 iOS 开发一个离线网络应用程序。它使用 ServiceWorker 和 CacheStorage API 来离线存储应用程序代码。
在 iOS 11 中,一切正常。 从 iOS 12 开始,每次重启浏览器都会清除 CacheStorage。
我设置了一个关于如何重现这个的小演示: 它向您显示页面/主机上有哪些缓存,然后创建一个包含图片的新缓存。所以下次你访问它时,应该有一个现有的缓存。
- 转到https://itoobi.github.io/servicebreaker/
- 页面显示“keys: size: 0”(当前为 0 个缓存)
- 它会创建一个名为“test”的新缓存并显示“缓存已打开”。
- 重新加载页面
- 页面现在显示“keys: test size: 1”(1 个缓存存在)(再次“缓存打开”,但这并不重要)
- 关闭浏览器(通过在 iOS 任务管理器中关闭它)
- 重启浏览器并重新加载页面
- 现在应该再次显示“keys: test size: 1”,因为应该有一个现有的缓存。 --> 在 iOS 12 上,页面再次显示“keys: size: 0”。
我在桌面浏览器上进行了测试,包括最新的 Chromium 和 Firefox,它们都可以工作。
使用 iOS 11.4.x Safari,它可以工作。 对于 iOS 12.x(12.0、12.1、12.1 beta 5)Safari,它不起作用。在不同的 iPad 和 iPhone 设备上进行了测试。
所以问题是:有人知道我做错了什么吗,Apple 是否更改了 API,或者这只是 Apple 方面的一个错误? 如果有人有类似的问题,我也会感兴趣,因为我没有找到与此相关的任何内容。
测试页面代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home Page</title>
</head>
<body>
<script>
caches.keys().then(function(keys){
alert("keys: "+keys+" size: "+keys.length);
});
caches.open("test").then(function(cache){
cache.add("mario.png");
alert("cache opened");
});
</script>
</body>
</html>
【问题讨论】:
-
听起来您可能正在使用私有实例打开浏览器。如果您在其他浏览器中这样做,这也是他们的行为。我在我的 iPhone 上尝试了它,它可以正常工作,保留缓存的图像。我使用的是 iOS 12.1.3,所以也许这是他们修复的早期错误。
标签: ios service-worker progressive-web-apps ios12 cachestorage