zoukankan      html  css  js  c++  java
  • App平台iOS设备上因内存不足导致白屏、闪退的原因及其解决方案

    一、原因

    1、问题背景原因

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

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

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

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

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

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

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

      一个缩略图控制在几k或十几k,才是合理的。

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

    二、解决方案

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

    1、iOS平台5+APP/WAP2APP使用WKWebview内核时由于内核崩溃引起白屏后自动恢复的方法

      HBuilderX 2.3.4+版本已将iOS上所有webview的默认内核由UIWebview调整为WKWebview请参考https://ask.dcloud.net.cn/article/36348,当内存占用过大或者应用切换到后台内存被回收会导致WKWebview内核Crash引起应用白屏,为了提高体验App支持Crash后的恢复,开发者可以通过简单的配置支持该功能。

      注意:

    (1)目前该功能针对在前台的应用,如果应用在后台时会直接重新启动不适用该规则

    (2)uniapp有自己的恢复逻辑不适用该规则

    2、支持的恢复行为

    • "restart":重启应用,关闭所有页面重新打开应用首页,可通过(plus.runtime.isRecovery)来判断应用是否恢复重启
    • "reload":重新加载当前WKWebview(崩溃的WKWebview)页面,页面中JS上下文中所有数据丢失,在当前Webview中可通过plus.webview.isRecovery判断是否恢复重新加载,在其它Webview中可监听recovery事件来判断
    • "none":不做任何操作

    3、全局配置

      在manifest.json中配置默认值

        "plus": {  //uni-app项目对应节点名称为"app-plus"  
            "kernel": {  
                "ios": "WKWebview",  
                "recovery": "restart|reload|none"  
            },  
            // ...  
        }

    4、webview配置

      webview style新增kernelRecovery属性,通过该项可以自定义单个webview的恢复行为,覆盖全局配置。引用文档

    var webview = plus.webview.create("[url]","[id]", {kernelRecovery:"restart|reload|none"});

    5、API

    (1)plus.webview.isRecovery:用于判断当前Webview窗口是否由于内核崩溃自动恢复,当配置reload时生效。引用文档

    (2)plus.runtime.isRecovery:用于判断当前应用是否是Webview崩溃自动恢复导致的启动,当配置restart时生效。引用文档

    6、事件

      recovery:当恢复行为配置为reload时,webview重新创建完成后会触发该事件,可以监听该事件做具体处理。引用文档

  • 相关阅读:
    运行从别处复制过来的linux可执行程序
    查看linux服务器版本
    编码问题
    Programmer Dvorak键盘布局
    Ubuntu下安装JDK图文解析
    数据结构和算法设计专题之---24点游戏(穷举法和递归法)
    数据结构和算法设计专题之---单链表的逆序
    Android中实现静态的默认安装和卸载应用
    J2EE学习篇之--JQuery技术详解
    MyEclipse6.0中使用aptana插件,添加jquery提示功能
  • 原文地址:https://www.cnblogs.com/goloving/p/14487957.html
Copyright © 2011-2022 走看看