iOS Safari 崩溃(问题反复出现)

18

我正在开发一个网站,在测试我的iPhone X时最近遇到了一个问题 - 网站无法加载。

Safari尝试加载它,然后报告错误“此网页已重新加载,因为出现问题”,经过几次尝试后放弃并报告“重复出现问题”。我的iPhone上的Chrome也无法加载该站点。

目前我无法公开分享网站,但是在chrome桌面控制台中没有报告任何错误。事实上,该网站在我的桌面电脑、笔记本电脑、旧版iPhone 6和5s、朋友的三星安卓和其他15个随机计算机和手机上都可以完美运行。 在xCode模拟器中也可以正常加载。但它在我的iPhone X上无法正常工作。

我在SO和互联网上的研究让我相信,这种错误通常是由于内存使用过多,但桌面Chrome仅报告内存使用峰值为20mb。而且,该网站在我的不太好的iPhone 5s上也可以正常加载。

我已清除了iPhone X上的Safari和Chrome缓存,切换了cookie阻止的开关,重置了网络设置,并重新启动了手机。

我担心如果我的iPhone X无法加载该网站,那么毫无疑问其他用户也会遇到问题,即使我测试过的20个杂项设备都可以正常工作。

有人知道这里发生了什么吗?


3
你在这方面有任何进展吗?我很想知道...我也遇到了类似的问题,不同的是网站会加载但任何交互都会导致网站立即崩溃。这个网站在旧一些性能较差的设备上运行良好。 - Theo.T
是的,听起来和我的问题一样。我刚刚发布了我的解决方案。 - nickc
4
最终拿到了一个设备 - 在我这种情况下,是因为有一个单独的 transform: scale(0.5, -0.05); filter: brightness(0.2) blur(50px); 声明。有趣的是,页面上还有很多更重的东西。 - Theo.T
1
我可以支持这个想法,即这是由于CSS渲染的某种方式 - 我曾经遇到过这个问题,但通过在调整不透明度和比例的元素上删除background-position的关键帧动画来解决它。 - rwcorbett
1
对我来说,这是一个异步 API 调用被卡在无限循环中,这证实了它很可能是内存问题。我将“检查任何 API 调用”添加到清单中。这个 bug 真的很奇怪,但这完全解决了我的问题。 - Marco Cano
8个回答

6
今天我遇到了这个问题,想看一下会导致这种情况发生的最小可重现代码。似乎在设置至少两个控件的autofocus属性并使用JavaScript请求任一控件的焦点时,iOS 14上的Safari和Chrome都会崩溃,并且在iOS <= 13上不会发生崩溃。macOS上的Chrome 87和Safari 13.1也没有受到影响。
是否发生崩溃取决于请求焦点的时间。在“窗口加载”事件中,一切正常运行。当在“文档就绪”处理程序中请求或在文档末尾请求时,情况变得糟糕。
在多个元素上设置autofocus没有太多意义,但浏览器不应崩溃。可以使用JavaScript回退来为缺乏对autofocus属性支持的浏览器提供一致的UX。显而易见的解决方法是删除所有冲突的autofocus属性。

/*
// Load event on window object: NO CRASH
window.addEventListener('load', (e) => document.querySelector('input[name="field_1"]').focus());

// DOMContentLoaded event on document object: CRASH
document.addEventListener('DOMContentLoaded', (e) => document.querySelector('input[name="field_1"]').focus());
*/

// End of document script: CRASH
document.querySelector('input[name="field_1"]').focus();
<!DOCTYPE html>
<html>
<body>
<form>
<p><label>First field<br><input type="text" name="field_1" autofocus></label></p>
<p><label>Second field<br><input type="text" name="field_2" autofocus></label></p>
</form>
</body>
</html>


遇到了这个问题,通过JavaScript将焦点从带有自动聚焦属性的输入框移开是原因。我们的解决方法是在元素上删除该属性,并仅通过脚本处理它。 - PeterToTheThird

5

当我尝试在Safari中使用three.js场景的渲染器上的 powerPreference 属性以“高性能”模式访问webgl上下文时,我在Safari中看到了相同的错误消息。

移除高性能模式后,我的网页得以加载。


4
我通过假设这确实是一个内存问题,并将display:none设置为在视口中不可见的元素(使用window on-scroll事件),来“解决”了这个问题。
这解决了我在 iPhone X 上使用 Safari 时崩溃的问题。但是它并没有解释为什么当 Web 应用程序消耗少于20MB的内存并且在其他任何较弱的设备上运行良好时,这种情况首先会发生。 https://medium.com/talk-like/detecting-if-an-element-is-in-the-viewport-jquery-a6a4405a3ea2

1
听起来像是一个相当激进的解决方案。通过删除转换和过滤器,我正在取得改进,但还没有能够将其缩小到一个单一的问题上。主要问题是我没有直接访问 iPhone X,因此测试非常繁琐。 - Theo.T
2
如我在评论中所述,我认为这是正确的答案——删除或限制过多的动画或CSS渲染似乎可以解决崩溃问题。我的网页也非常小(约21MB),在删除background-position动画后,它不再崩溃。为什么?我猜问苹果吧...我在其他设备上尝试时没有发生这种情况。¯_(ツ)_/¯ - rwcorbett

1
我花了很多时间来调试类似的问题。
对我而言,原因是我在使用Vuetify时,有两个文本字段都设置了autofocus属性。从元素中删除额外的autofocus可以为我解决这个问题。

稍微详细地解释一下,如果没有 JavaScript 的 .focus() 调用,我就无法重现这个问题。在同一页上设置超过一个控件的 autofocus 属性并不会触发崩溃。如果您有更多信息,我很乐意了解。 - Ro Achterberg

1

我遇到了类似的问题:

我的网站(只有在特定页面上)在iOS Safari上显示错误消息“在我的-页面-url上反复发生问题”,但控制台中没有任何错误。 在所有桌面浏览器上,此页面均可正常工作,在所有Android手机上也是如此,但在iOS Safari上,页面显示错误...

经过多小时的调查,我发现问题出在CSS属性上。

height: intrinsic;

这真的很奇怪,因为这个属性只在桌面版Safari上有效,在其他浏览器上被忽略了。但是移动版Safari却崩溃了...

所以我改变了这个CSS属性,一切都解决了 :)

希望这能帮助某人节省几个小时的调试时间 :)


我发现自己处于这种情况。你把CSS属性改成了什么? - blackheart dv
只是任何常见的属性,例如继承或100%。 - Sergey Fedirko

0

Safari因为Firestore占用了所有内存而崩溃,问题在这里:https://github.com/firebase/firebase-js-sdk/issues/6118,通过以下方式初始化Firestore已经解决了该问题:

export const db = initializeFirestore(app, {
  experimentalForceLongPolling: true,
})

0

我遇到了一个类似的问题,它涉及呈现一系列 SVG 的页面。将 SVG 替换为 PNG 解决了该问题。


0
为了后人和未来的搜索,我曾经为了解决NextJS应用中的同样问题而苦苦挣扎。
通过移除一个复杂的CSS盒子阴影,我成功解决了这个问题。该容器可以快速改变大小,从而改变其垂直高度,进而拉伸视口。一旦禁用了阴影,一切顺利如丝般流畅。
如果有人好奇,这是我使用的阴影效果。我从在线盒子阴影生成器中获取的。甚至没有考虑到可能出现的性能问题。
:root {
  --shadow--lg: 25px 50px 62px -3px rgba(9, 9, 12, 0.34),
    17px 34px 43px -2px rgba(9, 9, 12, 0.34),
    11px 22px 28px -2px rgba(9, 9, 12, 0.34),
    7px 14px 18px -1px rgba(9, 9, 12, 0.34),
    4px 9px 11px -1px rgba(9, 9, 12, 0.34),
    3px 4px 7px -1px rgba(9, 9, 12, 0.34), 2px 3px 4px rgba(9, 9, 12, 0.34),
    0px 1px 1px rgba(9, 9, 12, 0.34);
}

你是怎么知道就是这个影子的? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接