跨平台应用开发进阶(五十)uni-app ios web-view嵌套H5项目白屏问题分析及解决_app中加载h5页面白屏问题

最后

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。

+ [四、拓展阅读](#_246)

一、前言

应用uni-app框架开发好APP上架使用过程中,发现应用经过长时间由后台切换至前台时,通过webview方式嵌套的H5页面发生白屏现象。

二、问题分析

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

有关内存管理,详参博文《安全生产:内存溢出和内存泄漏》。

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

如果是uiwebview的app(常见于5+app),内存不足时整个app会崩溃,即闪退。

如果是wkwebview的app(uni-app和wap2app在iOS上默认就是wkwebview),内存不足时,单个wkwebview会崩溃。也就是所谓的应用还在,而页面白屏。

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

三、解决方案

  • uni-app因为引入了独立的jscore处理数据状态,jscore不会崩溃,所以官方采用了和微信小程序一致的策略,补充自动的白屏恢复能力。亲测使用 HBuilder 3.6.4.20220922 并无白屏自动恢复功能,怀疑是HBuilder版本问题!
  • uni-app中也可以使用nvue来避免这个问题,nvue页面不会出现内存不足引发的白屏崩溃。
3.1 nvue 页面替代 vue 页面

nvue文件webview使用方式如下:

//nvue 中的webview需要自行设置宽高否则无法展示<template>
    <view>
        <web-view ref="webview" src="/hybrid/html/local.html" style="width: 500px;height: 600px;" @onPostMessage="getMessage"></web-view>
    </view>
</template>

<script>
    export default {
        data(){
            return {
            }
        },
        onLoad() {
            setTimeout(()=>{
                this.handlePostMessage('测试传参')
            },200)
        },
        methods: {
            handlePostMessage(res) {
                this.$refs.webview.evalJs(`handleMessage()`);  
            },  
            getMessage(e) {
                uni.showModal({
                    content: JSON.stringify(e.detail),
                    showCancel: false
                })
            }
        }
    }
</script>

h5页面内容如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>本地网页</title>
        <style type="text/css">
            .btn {
                display: block;
                margin: 20px auto;
                padding: 5px;
                background-color: #007aff;
                border: 0;
                color: #ffffff;
                height: 40px;
                width: 200px;
            }

            .btn-red {
                background-color: #dd524d;
            }

            .btn-yellow {
                background-color: #f0ad4e;
            }

            .desc {
                padding: 10px;
                color: #999999;
            }
        </style>
    </head>
    <body>
        <p class="desc">web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。</p>
        <div class="btn-list">
            <button class="btn" type="button" data-action="navigateTo">navigateTo</button>
            <button class="btn" type="button" data-action="redirectTo">redirectTo</button>
            <button class="btn" type="button" data-action="navigateBack">navigateBack</button>
            <button class="btn" type="button" data-action="reLaunch">reLaunch</button>
            <button class="btn" type="button" data-action="switchTab">switchTab</button>
        </div>
        <p class="desc" id="lizhao">网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。</p>
        <div class="btn-list">
            <button class="btn btn-red" type="button" id="postMessage">postMessage</button>
        </div>
        <!-- uni 的 SDK -->
        <script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.1/index.js"></script>
        <script type="text/javascript">
            
            window.handleMessage=function(data){
                alert('传来的参数'+data)
            }    
            document.addEventListener('UniAppJSBridgeReady', function() {
                
                document.querySelector('.btn-list').addEventListener('click', function(evt) {
                    var target = evt.target;
                    if (target.tagName === 'BUTTON') {
                        var action = target.getAttribute('data-action');
                        switch (action) {
                            case 'switchTab':
                                uni.switchTab({
                                    url: '/pages/tabBar/API/API'
                                });
                                break;
                            case 'reLaunch':
                                uni.reLaunch({
                                    url: '/pages/tabBar/API/API'
                                });
                                break;
                            case 'navigateBack':
                                uni.navigateBack({
                                    delta: 1
                                });
                                break;
                            default:
                                uni[action]({
                                    url: '/pages/component/button/button'
                                });
                                break;
                        }
                    }
                });
                document.querySelector("#postMessage").addEventListener('click', function() {
                    uni.postMessage({
                        data: {
                            action: 'message888888'
                        }
                    });
                })
            });
        </script>
    </body>
</html>

注意⚠️:uni-app 中的 nvue 页面问题
nvue 页面不使用 webview 渲染,但其中的web-view组件说明如下:

  • nvueweex 组件模式weex模式下的web-view组件是weex自己实现的,它目前仍然使用UIWebview。官方会追踪weex的升级。
  • nvueuni-app组件模式web-view组件使用WKWebview,不可修改为uiWebview
3.2 白屏检测刷新
3.2.1 自动刷新
  1. 需要一个全局挂载的工具类,Vue.prototype.$utils = utils
  2. 在需要使用的页面(一般为tab页)最外层需要设置为同一个class名称;

最后:

总结来说,面试成功=基础知识+项目经验+表达技巧+运气。我们无法控制运气,但是我们可以在别的地方花更多时间,每个环节都提前做好准备。

面试一方面是为了找到工作,升职加薪,另一方面也是对于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

于自我能力的考察。能够面试成功不仅仅是来自面试前的临时抱佛脚,更重要的是在平时学习和工作中不断积累和坚持,把每个知识点、每一次项目开发、每次遇到的难点知识,做好积累,实践和总结。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

[外链图片转存中…(img-ttm1UHQp-1715276400914)]

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值