是我一个人的问题,还是iOS 17上的Safari存在bug,导致window.matchMedia("(prefers-color-scheme: dark)")添加的事件监听器没有被触发? iOS 16 上的 Safari 中不存在此类问题。仅当 Web 应用程序作为 PWA 安装在主屏幕上时才会出现此问题。在浏览器中,一切正常。
代码:
useEffect(() => {
function handleColorSchemeChange(event) {
// this listener won't trigger when the web app is installed as PWA on the iPhone's home screen
const newColorScheme = event.matches ? "dark" : "light";
setCurrentDarkMode(newColorScheme);
}
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", handleColorSchemeChange);
return () => {
window
.matchMedia("(prefers-color-scheme: dark)")
.removeEventListener("change", handleColorSchemeChange);
};
}, []);
我尝试在 iPhone 上安装 PWA 应用程序(例如 timezones.digital)并切换系统的暗/亮模式
我偶然发现从 PWA 打开另一个窗口并关闭它,将强制重新评估配色方案。
我发现的另一个错误:通过滑动另一个窗口(也会关闭它)向后移动,重新评估配色方案,但将访问页面中的
<meta name="theme-color" ... >
内容应用到您的 PWA(!)。这有时会让我的应用程序在凹口周围出现蓝色或红色区域。
作为解决方法,我现在这样做:
window.open('/colorscheme-fix.html');
其中
colorscheme-fix.html
立即自行关闭(根据您的意愿装饰它,以防它意外显示或由于某种原因未关闭):
<html>
<script>window.close();</script>
</html>
这会导致轻微的闪烁,但实际上几乎察觉不到。