国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

跨平臺應用開發(fā)進階(五十)uni-app ios web-view嵌套H5項目白屏問題分析及解決

這篇具有很好參考價值的文章主要介紹了跨平臺應用開發(fā)進階(五十)uni-app ios web-view嵌套H5項目白屏問題分析及解決。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、前言

應用uni-app框架開發(fā)好APP上架使用過程中,發(fā)現(xiàn)應用經(jīng)過長時間由后臺切換至前臺時,通過webview方式嵌套的H5頁面發(fā)生白屏現(xiàn)象。

二、問題分析

任何手機設備上,當手機內(nèi)存不足時,os都會回收資源。一般是先回收后臺打開的資源。如果當前應用占用的資源過高,當前應用也有可能崩潰。尤其是在調(diào)用攝像頭點擊拍照時,手機內(nèi)存占用會達到一個峰值,此時較容易出問題。

有關內(nèi)存管理,詳參博文《安全生產(chǎn):內(nèi)存溢出和內(nèi)存泄漏》。

在iOS上,當內(nèi)存不足時,根據(jù)uiwebviewwkwebview的不同,它自身有不同的回收策略。

如果是uiwebview的app(常見于5+app),內(nèi)存不足時整個app會崩潰,即閃退。

如果是wkwebview的app(uni-app和wap2app在iOS上默認就是wkwebview),內(nèi)存不足時,單個wkwebview會崩潰。也就是所謂的應用還在,而頁面白屏。

這個問題在所有使用wkwebview的應用都會出現(xiàn),比如微信的公眾號網(wǎng)頁里也存在。在微信小程序里,它做了一個自動恢復手段,可以讓jscore存儲數(shù)據(jù)狀態(tài),崩潰的wkwebview自動恢復。所以在遇到問題時,會白一下然后恢復渲染。

三、解決方案

  • uni-app因為引入了獨立的jscore處理數(shù)據(jù)狀態(tài),jscore不會崩潰,所以官方采用了和微信小程序一致的策略,補充自動的白屏恢復能力。親測使用 HBuilder 3.6.4.20220922 并無白屏自動恢復功能,懷疑是HBuilder版本問題!

  • uni-app中也可以使用nvue來避免這個問題,nvue頁面不會出現(xiàn)內(nèi)存不足引發(fā)的白屏崩潰。

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頁面內(nèi)容如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>本地網(wǎng)頁</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 環(huán)境下生效。點擊下列按鈕,跳轉(zhuǎn)至其它頁面。</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">網(wǎng)頁向應用發(fā)送消息。注意:小程序端應用會在此頁面后退時接收到消息。</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('傳來的參數(shù)'+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自己實現(xiàn)的,它目前仍然使用UIWebview。官方會追蹤weex的升級。

  • nvueuni-app組件模式web-view組件使用WKWebview,不可修改為uiWebview。

3.2 白屏檢測刷新

3.2.1 自動刷新
  1. 需要一個全局掛載的工具類,Vue.prototype.$utils = utils
  2. 在需要使用的頁面(一般為tab頁)最外層需要設置為同一個class名稱;
  3. onshow方法調(diào)用;
let pageList = {};
const utils = {
    reloadCurrentPage: function(_self, isTab = true) {
        // #ifdef APP-PLUS
        // 獲取當前路由及傳參,以備頁面刷新之用
        var route = _self.$scope.route;
        var data = _self.$scope.options && _self.$scope.options.data;
        var url = '/' + route;
        if (data) {
            url = '/' + route + '?data=' + data;
        }
        var isRecovery = true; // 頁面刷新標識
        let newTime = Date.now();
        if (pageList[url]) {
            const query = uni.createSelectorQuery().in(_self);
            //這里select()中替換為自己的樣式class名稱
            query.select('.container').fields({size:true}, data => {
                isRecovery = false; // 重置頁面刷新標識
            }).exec();
            setTimeout(() => {
            	// 頁面白屏,需觸發(fā)刷新機制
                if (isRecovery) {
                    //如果獲取不到節(jié)點
                    //確保只刷新一次
                    if (newTime - pageList[url] > 3000) {
                        //超過3秒才重新刷新,這里設置幾秒就行,目的是防止無限刷新
                        //因為刷新后頁面肯定會出來,但是立馬再次調(diào)用該方法不一定能獲取節(jié)點(DOM樹未必構建完畢)
                        pageList[url] = newTime;
                        // 若為tab標簽欄位
                        if (isTab) {
                            uni.reLaunch({
                                url
                            })
                        } else {
                        	// 若為頁面
                            uni.redirectTo({
                                url
                            })
                        }
                    }
                }
            }, 600)
        } else {
        	// 頁面正常,記錄當前時間
            pageList[url] = newTime;
        }
        // if (plus.os.name === 'iOS') {

        // }
        // #endif
    }
}
3.2.2 手動刷新

webview頁面提供按鈕以支持用戶手動刷新,

uniapp使用webview無法打開該頁面,Cross-platform APP,前端,uni-app,ios
手動刷新實現(xiàn)邏輯如下:

手動刷新按鈕在檢測到白屏事件發(fā)生時顯示:

query.select('.container').fields({size:true}, data => {
     isShow = true; // 展示刷新按鈕
 }).exec();

應用3.2.1小節(jié)提供的刷新方法,當點擊刷新按鈕調(diào)用刷新方式。

3.3 總結

在前端減少內(nèi)存使用,最重要的就是圖片渲染,尤其是大圖片。

在頁面上不要渲染多張大圖,比如從攝像頭或相冊選擇多張圖,并縮放尺寸渲染在頁面上,雖然肉眼看起來手機屏幕上是幾張小圖,但實際上是多張大圖只是被縮小,這種情況非常耗費內(nèi)存。一張圖片3m,9張這樣的大圖同時渲染到屏幕上,什么手機都受不了。

一個縮略圖控制在幾k或十幾k,才是合理的。

詳情頁面展現(xiàn)多張大圖并不受影響。如果圖片滾動在屏幕外,os內(nèi)存不足時也會自動收回這些屏幕外圖片占用的渲染資源,最吃資源的就是同屏渲染多張大圖。文章來源地址http://www.zghlxwxcb.cn/news/detail-631347.html

四、拓展閱讀

  • 《uni-app中Webview的使用注意》
  • 《uni-app SelectorQuery》
  • 《跨平臺應用開發(fā)進階(五十六):應用渲染異常問題分析及解決》
  • 《安全生產(chǎn):內(nèi)存溢出和內(nèi)存泄漏》

到了這里,關于跨平臺應用開發(fā)進階(五十)uni-app ios web-view嵌套H5項目白屏問題分析及解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 盤點 | 跨平臺桌面應用開發(fā)的5大主流框架

    盤點 | 跨平臺桌面應用開發(fā)的5大主流框架

    受益于開源技術的發(fā)展,以及響應快速開發(fā)的實際業(yè)務需求,跨平臺開發(fā)不僅限于移動端跨平臺,桌面端雖然在市場應用方面場景不像移動端那么豐富,但也有市場的需求。 相對于個人開發(fā)者而言,跨平臺框架的使用,主要為了滿足以下三個主要能力: 生產(chǎn)力提升:框架能

    2024年02月07日
    瀏覽(23)
  • 構建跨設備3D應用:HOOPS的跨平臺開發(fā)能力

    構建跨設備3D應用:HOOPS的跨平臺開發(fā)能力

    在當今數(shù)字化和可視化需求不斷提升的時代,三維技術的應用越來越廣泛,尤其在制造、建筑、工程及媒體行業(yè)。HOOPS,由Tech Soft 3D開發(fā),是一套全面的軟件開發(fā)工具包,用于構建高性能的三維應用程序。該工具包涵蓋了從三維渲染到復雜數(shù)據(jù)交換的多個方面,支持廣泛的文

    2024年04月25日
    瀏覽(97)
  • 在CPF里使用OpenGL做跨平臺桌面應用開發(fā)

    在CPF里使用OpenGL做跨平臺桌面應用開發(fā)

    CPF 是開源的C#跨平臺UI框架,支持使用OpenGL來渲染,可以用來硬件加速播放視頻或者顯示3D模型 實現(xiàn)原理其實就是Skia用OpenGL后端,Skia里綁定GLView的OpenGL紋理,將紋理作為Skia的圖像混合繪制。 在CPF里使用OpenGL,不能選擇NetCore3.0和Net4,需要選擇Netcore3.1以及之后的版本。 Nuget里

    2024年02月05日
    瀏覽(35)
  • 從零基礎到精通Flutter開發(fā):一步步打造跨平臺應用

    從零基礎到精通Flutter開發(fā):一步步打造跨平臺應用

    ?? 個人網(wǎng)站:【工具大全】【游戲大全】【神級源碼資源網(wǎng)】 ?? 前端學習課程:??【28個案例趣學前端】【400個JS面試題】 ?? 尋找學習交流、摸魚劃水的小伙伴,請點擊【摸魚學習交流群】 導言 Flutter是一種流行的開發(fā)框架,可以用來構建美觀、高性能且跨平臺的移動應

    2024年02月08日
    瀏覽(95)
  • 跨平臺的桌面應用程序開發(fā)框架Electron | 開源日報 0906

    跨平臺的桌面應用程序開發(fā)框架Electron | 開源日報 0906

    Stars: 109.3k License: MIT Electron 是一個基于 Node.js 和 Chromium 的開源框架,允許使用 JavaScript、HTML 和 CSS 編寫跨平臺的桌面應用程序。它被 Atom 編輯器等眾多應用程序所采用。該項目具有以下核心優(yōu)勢: 跨平臺:Electron 提供了 macOS、Windows 和 Linux 三個主要操作系統(tǒng)的二進制文件。

    2024年02月09日
    瀏覽(27)
  • Vue.js + Electron 的跨平臺桌面應用程序開發(fā)

    本文介紹了 Vue.js 和 Electron 的基本特點和原理,并分析了它們在桌面應用程序開發(fā)中的優(yōu)勢和應用場景。在基于 Vue.js 和 Electron 的桌面應用程序開發(fā)實踐中,本文詳細介紹了項目的搭建和配置,包括環(huán)境的準備、項目的初始化和依賴的安裝等步驟。然后,本文介紹了使用 Vu

    2024年02月13日
    瀏覽(20)
  • 打破邊界:視頻美顏SDK在跨平臺開發(fā)中的應用創(chuàng)新

    打破邊界:視頻美顏SDK在跨平臺開發(fā)中的應用創(chuàng)新

    如今,視頻美顏技術的崛起為用戶提供了更多創(chuàng)造力和自由度。隨著跨平臺開發(fā)的興起,視頻美顏SDK在各種應用中展現(xiàn)出獨特的創(chuàng)新和應用潛力。 一、跨平臺開發(fā)的興起 跨平臺開發(fā)通過共享代碼庫、提高開發(fā)效率,為開發(fā)者提供了更好的解決方案。 二、視頻美顏SDK的引入

    2024年01月22日
    瀏覽(29)
  • Flutter與Android開發(fā):構建跨平臺移動應用的新選擇

    Flutter與Android開發(fā):構建跨平臺移動應用的新選擇

    本文內(nèi)容提綱如下: 介紹Flutter技術:Flutter是一種由Google推出的開源UI工具包,用于構建高性能、跨平臺的移動應用。文章將介紹Flutter的基本概念、特點和優(yōu)勢,包括其快速的開發(fā)速度、一致的用戶界面和豐富的UI組件庫等。 Flutter與Android開發(fā)的對比:文章將對比Flutter與傳統(tǒng)

    2023年04月21日
    瀏覽(1005)
  • 使用electron-vite +Vue+ElementPlus開發(fā)跨平臺桌面應用

    使用electron-vite +Vue+ElementPlus開發(fā)跨平臺桌面應用

    我們的項目是基于Elasticsearch來進行數(shù)據(jù)的存儲與查詢的,使用過ES的朋友應該都比較清楚,現(xiàn)在還沒有一個比較友好的ES的桌面客戶端軟件可以和MySQL的桌面客戶端軟件媲美的,使用ES起來非常麻煩,經(jīng)常會被吐槽的三個點: 資深測試吐槽:為什么技術選型要選擇ES,增刪改查

    2023年04月09日
    瀏覽(97)
  • 【粉絲福利社】Flutter小白開發(fā)——跨平臺客戶端應用開發(fā)學習路線(文末送書-完結)

    【粉絲福利社】Flutter小白開發(fā)——跨平臺客戶端應用開發(fā)學習路線(文末送書-完結)

    ?? 作者簡介,愚公搬代碼 ??《頭銜》:華為云特約編輯,華為云云享專家,華為開發(fā)者專家,華為產(chǎn)品云測專家,CSDN博客專家,CSDN商業(yè)化專家,阿里云專家博主,阿里云簽約作者,騰訊云優(yōu)秀博主,騰訊云內(nèi)容共創(chuàng)官,掘金優(yōu)秀博主,51CTO博客專家等。 ??《近期榮譽》:

    2024年01月16日
    瀏覽(103)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包