DCloud_heavensoft
DCloud_heavensoft
  • 发布:2019-05-09 21:47
  • 更新:2023-03-31 15:55
  • 阅读:38830

App平台iOS设备上因内存不足导致白屏、闪退的问题解决方案

分类:uni-app

原因

任何手机设备上,当手机内存不足时,os都会回收资源。一般是先回收后台打开的资源。如果当前应用占用的资源过高,当前应用也有可能崩溃。
尤其是在调用摄像头点击拍照时,手机内存占用会达到一个峰值,此时较容易出问题。

iOS上当内存不足时,根据uiwebview和wkwebview的不同,它自身有不同的回收策略。

  • 如果是uiwebview的app(常见于5+app),内存不足时整个app会崩溃,即闪退。
  • 如果是wkwebview的app(uni-app和wap2app在iOS上默认就是wkwebview),内存不足时,单个wkwebview会崩溃。也就是所谓的应用还在,而页面白屏。

这个问题在所有使用wkwebview的应用都会出现,比如微信的公众号网页里也存在。在微信小程序里,它做了一个自动恢复手段,可以让jscore存储数据状态,崩溃的wkwebview自动恢复。所以在遇到问题时,会白一下然后恢复渲染。

解决方案

  • uni-app因为引入了独立的jscore处理数据状态,jscore不会崩溃,所以官方采用了和微信小程序一致的策略,补充自动的白屏恢复能力。
  • uni-app中也可以使用nvue来避免这个问题,nvue页面不会出现内存不足引发的白屏崩溃。
  • 5+app、wap2app,一方面注意前端代码写法,减低内存使用。另外HBuilder2.3.4+开始支持配置WKWebview内核奔溃是重新启动应用还是重新加载页面的配置,详情参考:https://ask.dcloud.net.cn/article/36540。但整体而言,5+app和wap2app在WKWebview下问题很多,还有各种跨域限制,还是建议开发者尽快升级为uni-app。

在前端减少内存使用的注意

最重要的注意,就是图片渲染,尤其是大图片。

在页面上不要渲染多张大图,比如从摄像头或相册选择多张图,并缩放尺寸渲染在页面上,虽然肉眼看起来手机屏幕上是几张小图,但实际上是多张大图只是被缩小,这种情况非常耗费内存。一张图片3m,9张这样的大图同时渲染到屏幕上,什么手机都受不了。
一个缩略图控制在几k或十几k,才是合理的。

详情页面展现多张大图并不受影响。如果图片滚动在屏幕外,os内存不足时也会自动收回这些屏幕外图片占用的渲染资源,最吃资源的就是同屏渲染多张大图。

10 关注 分享
2***@qq.com 2***@qq.com 7***@qq.com s***@163.com 2***@qq.com 5***@qq.com 穷鬼溪风 2***@qq.com h***@163.com DCloud_UNI_HRK

要回复文章请先登录注册

DCloud_UNI_GSQ

DCloud_UNI_GSQ

能稳定复现uni-app白屏问题的可以私信发我你的QQ,一起排查一下
2020-12-11 20:40
望

我和楼下的朋友,问题一样,程序是uni-app开发的iOS APP,5个tabBar都是vue页面,只会恢复一个,其它4个是白屏,没有用nvue。我已确保自己写的代码没有问题,因为现在全部页面用nvue不太可能,所以希望官方能在恢复能力上改善一下,考虑多个tabBar的情况。
#####用iPhone 7 Plus可以复现,操作步骤:
> 1、打开uni-app程序,依次点击5个tabBar页面,全部渲染加载正常;
> 2、切换到微信或淘宝等APP,随便操作,消耗一些内存;
> 3、切换回uni-app程序,可以看到当前停留的tabBar页面刷新恢复了,点开另外4个tabBar页面没有自动恢复,空白的。
2020-12-10 21:08
1***@163.com

1***@163.com

回复 DCloud_heavensoft :
大佬,我的是uniapp,tabbar页面都是vue页面,在ios上,长时间只会恢复最后一个tabbar页面,其他的tabbar页面还是白屏的,怎么解决啊
2020-12-09 11:10
aiplat点com

aiplat点com

旧app用的还是h5+创建的,使用的是mui,内嵌一些h5页面,h5页面的框架是uni-app的。app有tabs共5个菜单,有一个菜单是本地页面内嵌webview指向uni-app框架的h5站点链接,在h5站点页面时跳转到其他页面时是用打开app窗口方式并内嵌uni-app框架的h5站点链接。打开的指向uni-app框架的h5站点链接的app窗口愈多时,就经常闪退。
2020-11-25 08:43
zhangyq

zhangyq

回复 DCloud_heavensoft :
在ios下,使用vue页面做首页,跳转到nvue页面会出现白屏,使用nvue页面做首页就没这个问题了,这怎么解决呢?
2020-11-20 15:51
DCloud_heavensoft

DCloud_heavensoft (作者)

回复 叶耳朵 :
Apple的WKWebview就这么限制,别折腾hybrid了,赶紧改成uni-app吧
2020-11-15 08:26
叶耳朵

叶耳朵

回复 8***@qq.com :
对啊 这种问题为啥要开发者解决?
2020-11-14 18:57
[已删除]

[已删除]

回复 DCloud_heavensoft :
实际就是没有恢复成功,还是会出现白屏
2020-11-14 14:10
w***@126.com

w***@126.com

回复 AlanLee1473 :
```
export function reloadCurrentPage(_self, isTab = true) {
if (plus.os.name === 'iOS') {
var route = _self.$scope.route
var data = _self.$scope.options && _self.$scope.options.data
var url = '/' + route
if (data) {
url = '/' + route + '?data=' + data
}
console.log(url)
const query = uni.createSelectorQuery().in(_self);
var isRecovery = true;
query
.select('#containerId')
.boundingClientRect(data => {
isRecovery = false
})
.exec();

setTimeout(() => {
console.log(isRecovery)
if (isRecovery) {
if (isTab) {
uni.reLaunch({
url
})
} else {
uni.redirectTo({
url
})
}
}
}, 600)
}

}
```
2020-10-19 15:59
AlanLee1473

AlanLee1473

回复 w***@126.com :
query和isTab变量没有声明,老哥,能发一下嘛?
2020-09-17 10:26