问题场景:使用 uni-app 打包的 App,iOS 用户在使用过程经常遇到白屏,需要重启应用才恢复。安卓用户没有问题
打包环境: App 使用 HBuilder X 3.8.7,Vue2;Webview H5 使用 uni-app 的 vue-cli 版本,依赖是 2.0.0-alpha-33020211130001
客户端:仅在 iOS 上发生,机型和 iOS 版本比较分散,各种都有,没有集中在某个机型或版本,具体可看附件
复现方法:找不到稳定复现的方式,本地尝试打开相机和大型游戏,也无法触发 webview 崩溃
App 访问 H5 Webview 是用下面的代码:
currentWebView = plus.webview.create(href, "out-web", {
bottom: 0,
statusbar: {
background: "#FFFFFF"
},
popGesture: "close",
backButtonAutoControl: "close",
scalable: true,
replacewebapi: {
geolocation: "auto"
},
kernelRecovery: "reload"
})
我们在代码中通过 addEventListener('recovery') 监听到了大量的事件。
使用的是这个 API:https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject
我想咨询的是:
- 为什么会触发白屏,是 iOS 内存的原因吗?但崩溃的机型中也有 14 Pro Max,6G 内存应该也不小。而且安卓一例都没有,安卓也不全是大内存。还是说两者机制不同?
- 监听到 recovery 是否表示 webview 崩溃并且导致白屏?
- 开发者能做什么,能否帮用户重启 Webview(通过 App 重启或者在 H5 中自动重启)?我有看下面两篇文档,但均提到 uni-app 有自动重启机制,所以不确定开发是否需要手动介入。并且我在 App加了
kernelRecovery: "reload"
也没有效果。
https://ask.dcloud.net.cn/article/36540
https://ask.dcloud.net.cn/article/35913
有没有遇到类似问题的同学指点一下。
cndappdev (作者)
解决了。
plus.webview.getDisplayWebview() API 在 iOS 下存在一个 bug:从 App 创建一个 H5(webview)窗口,然后在 H5 下隐藏 App,此时再去打开 10 余个 App 或者挂起一段时间(目的是消耗 iOS 内存,让 iOS 杀掉 App 进程),最后再重新打开 App,此时 H5 页面在自动刷新之后,再返回上一个页面可能会出现白屏现象。
调用此 API 的初衷是为了获取屏幕上所有可视的 webview 窗口。所以可以用另外一个 API plus.webview.all() 再结合 webview 是否可见等条件来代替上述有问题的 API。
2023-12-27 09:44
格克
回复 cndappdev: 能给一下具体代码吗,我也遇到了,各种方法都试了
2024-02-04 15:18