【uniapp-ios】App端與webview端相互通信的方法以及注意事項

前言

在開發中,使用uniapp開發的項目開發效率是極高的,使用一套代碼就能夠同時在多端上線,像筆者之前寫過的使用Flutter端和webview端之間的相互通信方法和問題,這種方式本質上實際上是h5和h5之間的通信,網上有非常多的方案,最簡單的就是使用postMessage和addEventListener的方式,這個在我之前的文章有講解,這里不再贅述。
那么今天的問題,是使用uniapp開發的App端和H5端(webview)之間的通信問題

注意前提,是使用uniapp同時去開發app端和h5端。

問題

uniapp本質開發的app實際上還是web,那么能不能用postMessage的方式呢?
答案當然是可以的,但是你要區分情況,仔細看看官方文檔
在這里插入圖片描述
平臺差異說明:App-nvue,是App-nvue的方法,這是個坑!!!

所以,這個時候就需要去區分情況了,你使用的是vue寫的webview還是nvue寫的webview

vue類型的webview

在這里插入圖片描述

<web-view :src="src" ref="webview" :fullscreen="false" @message="receiveData"></web-view>

app傳遞數據給h5

本質:h5在webview環境中提取放入一個函數,app調用該函數傳遞數據進去。

h5端接收:可以在app.vue的onLaunch階段

window.msgFromUniapp = (res) =>{console.log("原生傳遞過來的數據:",res)
}

app端發送:

methods: {//給webview傳遞數據postMess(msg) {const currentWebview = this.$scope.$getAppWebview();const wv = currentWebview.children()[0];wv.evalJS(`msgFromUniapp('${JSON.stringify(msg)}')`)}},onLoad(item) {this.src = decodeURIComponent(item.url)// 傳入需要跳轉的鏈接 使用web-view標簽進行跳轉this.title = item.title// #ifdef APP-PLUSconst currentWebview = this.$scope.$getAppWebview();const that = thissetTimeout(function() {let wv = currentWebview.children()[0];that.postMess({type: 'app/systemInfo',data: {sys: 'ios'},code: 1,})}, 500);// #endif}

h5傳遞給app

app端接收:
添加監聽即可

@message="receiveData"

h5端發送:

  //傳遞url給原生應用uni.webView.postMessage({data:{action:'openUrl',url:this.orderDetail.url}})

注意事項

app端要延遲再去獲取webview實例,等webview加載完成。
官方寫的是uni.posMessage,筆者親試,沒用的,注意是是 uni.webView.postMessage

nvue類型的webview

vue頁面和nvue頁面的區別,這里不做贅述,官方文檔寫的很清楚。

這個時候就可以使用官方文檔的postMessage方式來

app傳遞數據給h5

綁定一個ref,獲取webview實例

 <web-view ref="webview" :src="src" @onPostMessage="handlePostMessage":style="{height:mbHeight,width:mbWidth,top:mbTop}" fullscreen="false"></web-view>
  this.$refs.webview.postMessage(data, '*')

或者

// 調用 webview 內部邏輯evalJs: function() {this.$refs.webview.evalJs("document.body.style.background ='#00FF00'");}
  • 然后h5使用window.addEventListener接收

h5傳遞數據給app

在這里插入圖片描述

app接收消息:

<web-view ref="webview" class="webview" @onPostMessage="handlePostMessage"></web-view>
	handlePostMessage: function(data) {console.log("接收到消息:" + JSON.stringify(data.detail));},

注意事項

頁面空白

如果你是nvue頁面:
在這里插入圖片描述
大概率是你沒指定寬高,不信你放入一個百度的url試試,如果還是空白,請你設置style指定寬高。

如果你是vue頁面,可能就是網頁本身就打不開

環境問題

這是一個非常頭疼的問題,我怎么知道這個web頁面是在app環境打開還是在h5打開的,為什么需要去區分環境問題,因為你可能有一個這樣的場景,你開發的app需要打開一個網頁,然后撐滿全屏,本質還是用webview容器去打開的,h5不知道自己所處的環境是app端,那么就會帶來導航欄區域和底部安全區域怎么獲取和處理的問題。

你可以選擇從app端下手,前提是這個webview必須是nvue頁面,因為vue頁面默認webview是撐滿全屏的,撐滿全屏,撐滿全屏。

如果你是vue頁面,那么你可以通知h5端當前所處的環境,當前的導航欄高度和安全區域高度,在h5端單獨去做樣式兼容

如果你是nvue頁面,除了上述方式,你還可以自己去指定webview的樣式。

我還是建議都使用第一種方案吧,筆者自己去設置webview的樣式發現在全屏階段還是有一些問題的,不如默認撐滿全屏,在h5端去做調整,畢竟調整h5端端成本最小,上架之后的app還需要提審等一些列步驟。

側滑返回問題

可能有小伙伴發現,我打開一個webview,網頁里面本身有好多跳轉,為什么沒辦法側滑返回。

原因是,本質上,在app端你打開的實際上只有一個webview頁面,它只有一個頁面,你的h5頁面是在里面打開的,無論你h5的路由棧有多少層多沒用,對于app來說,就只有一個webview頁面。

所以,一定要注意放一個返回按鈕提供給用戶返回的機會,如果你要跳轉外部網頁,也不要用window.location去進行跳轉,到時候就會返回不了了,你可以通知app端使用plus方法去打開網頁

總結

官方文檔并沒有詳細去區分兩者的區別,網上的信息也很雜亂,所以在此特別去做區分和處理,如果你有更好的建議和方案,歡迎在評論區提出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42137.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42137.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42137.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ios身份證實名認證接口開發示例助力電商物流實名認證

為了更好的利用貨車資源&#xff0c;也方便企業正常的運送貨物&#xff0c;“互聯網電商”平臺可謂風起云涌。貨車司機和有發貨需求的人們可以在物流平臺注冊&#xff0c;貨車司機接單為有運送需求的用戶提供有償貨運服務。那么&#xff0c;如何讓企業放心的將貨物安心的交予貨…

物聯網實訓室建設可行性報告

一、建設物聯網實訓室的目的和意義 隨著信息技術的快速發展&#xff0c;物聯網&#xff08;IoT&#xff09;已成為推動社會進步和經濟發展的關鍵技術之一。物聯網技術的集成應用&#xff0c;不僅能夠提高生產效率&#xff0c;還能促進智慧城市、智能家居、智能農業等多個領域的…

python04——類(基礎new)

類其實也是一種封裝的思想&#xff0c;類就是把變量、方法等封裝在一起&#xff0c;然后可以通過不同的實例化對其進行調用操作。 1.類的定義 class 類名&#xff1a; 變量a def __init__ (self,參數2&#xff0c;參數2...)&#xff1a;初始化函數&#xff01;&#xff01;&…

vivado DELAY_VALUE_XPHY、DIFF_TERM

延遲_值_XPHY PORT對象上的DELAY_VALUE_XPHY屬性指定要添加的延遲量 Versal XPHY邏輯接口的輸入或輸出路徑。在的早期階段 opt_design在重新生成高級I/O向導IP時 DELAY_VALUE_XPHY值將從PORT復制到的XPHY實例上 輸入或輸出路徑。Vivado設計套件中存在DRCs&#xff0c;以確保 DE…

簡單實現聯系表單Contact Form自動發送郵件

如何實現簡單Contact Form自動郵件功能&#xff1f;怎樣簡單設置&#xff1f; 聯系表單不僅是訪客與網站所有者溝通的橋梁&#xff0c;還可以收集潛在客戶的信息&#xff0c;從而推動業務的發展。AokSend將介紹如何簡單實現一個聯系表單&#xff0c;自動發送郵件的過程&#x…

java Collections類介紹

Java 的 java.util.Collections 類提供了一組靜態方法&#xff0c;用于操作或返回集合&#xff08;如列表、集合和映射&#xff09;。Collections 類是一個實用工具類&#xff0c;旨在為集合提供便捷的算法和操作。以下是對 Collections 類及其常用方法的介紹。 常用方法總結 …

【游戲客戶端】大話slg玩法架構(一)滾動基類

【游戲客戶端】大話slg玩法架構&#xff08;一&#xff09;滾動基類 大家好&#xff0c;我是Lampard家杰~~ 今天我們兌現諾言&#xff0c;給大家分享SLG玩法的實現j架構&#xff0c;關于SLG玩法的介紹可以參考這篇上一篇文章&#xff1a;【游戲客戶端】制作率土之濱Like玩法 PS…

保險理論與實踐

《保險理論與實踐》是由中國保險學會主辦的學術集刊&#xff0c;于2016年1月正式創辦&#xff0c;致力于發表權威、嚴謹、高質量的理論研究、政策研究和實務研究成果&#xff0c;強調學術性與政策性、理論性與實踐性的有機結合。本刊由中國金融出版社公開出版&#xff0c;每月下…

postmessage()在同一域名下,傳遞消息給另一個頁面

這里是同域名下&#xff0c;getmessage.html&#xff08;發送信息&#xff09;傳遞消息給index.html&#xff08;收到信息&#xff0c;并回傳收到信息&#xff09; index.html頁面 <!DOCTYPE html> <html><head><meta http-equiv"content-type"…

機器學習統計學基礎 - 最大似然估計

最大似然估計&#xff08;Maximum Likelihood Estimation, MLE&#xff09;是一種常用的參數估計方法&#xff0c;其基本原理是通過最大化觀測數據出現的概率來尋找最優的參數估計值。具體來說&#xff0c;最大似然估計的核心思想是利用已知的樣本結果&#xff0c;反推最有可能…

Java并發編程工具包(JUC)詳解

在現代軟件開發中&#xff0c;多線程編程是一個不可避免的話題。為了更好地管理和利用多線程&#xff0c;Java提供了一個強大的工具包——java.util.concurrent&#xff08;簡稱JUC&#xff09;。JUC包含了許多用于并發編程的類和接口&#xff0c;幫助開發者高效、安全地處理線…

binutils ifunc 流程圖

上圖是x86 binutils 的流程圖。 函數說明_bfd_x86_elf_link_hash_table_createInit local STT_GNU_IFUNC symbol hash.elf_x86_64_check_relocsAdd support for handling STT_GNU_IFUNC symbols_bfd_elf_x86_get_local_sym_hashFind and/or create a hash entry for local sym…

[Go] 字符串遍歷數據類型問題

字符串遍歷問題 在使用for i,v:range str遍歷字符串時 str[i]是unit8&#xff08;byte&#xff09;類型&#xff0c;返回的是單個字節 字符串在Go中是以字節序列的形式存儲的&#xff0c;而 str[i] 直接訪問了這個字節序列中的第 i 個字節。如果字符串中的字符是單字節的ASCII…

Leetcode—97. 交錯字符串【中等】

2024每日刷題&#xff08;140&#xff09; Leetcode—97. 交錯字符串 2d動規實現代碼 class Solution { public:bool isInterleave(string s1, string s2, string s3) {int m s1.length();int n s2.length();int len s3.length();if(m n ! len) {return false;}vector<…

SpringBoot日常:封裝rabbitmq starter組件

文章目錄 邏輯實現RabbitExchangeEnumRabbitConfigRabbitModuleInfoRabbitModuleInitializerRabbitPropertiesRabbitProducerManagerPOM.xmlspring.factories 功能測試application.yml配置生產者&#xff1a;消費者&#xff1a;測試結果&#xff1a;總結 本章內容主要介紹編寫一…

stm32 USB CDC類虛擬串口初體驗

1. 目標 本文介紹CubeMX生成 USB CDC類虛擬串口工程的操作步驟。 2. 配置流程 時鐘配置 usb外設需要48M時鐘輸入 stm32405使用外部時鐘源HSE,否則配不出來48M時鐘stm32h750內部有一個48M時鐘 stm32f405時鐘配置 stm32h750時鐘配置 Connectivity ->USB_OTG_FS 和 Connect…

GEE代碼實例教程詳解:植被狀況指數(VCI)與干旱監測

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 進行植被狀況指數&#xff08;Vegetation Condition Index, VCI&#xff09;的計算和干旱監測。通過MODIS NDVI數據&#xff0c;我們可以評估2001年至2024年間的植被狀況和干旱等級。 背景知識 MODIS NDV…

C++初階:從C過渡到C++的入門基礎

??所屬專欄&#xff1a;C?? ??作者主頁&#xff1a;嶔某?? C發展歷史 C的起源可以追溯到1979年&#xff0c;當時BjarneStroustrup(本賈尼斯特勞斯特盧普&#xff0c;這個翻譯的名字不同的地?可能有差異)在?爾實驗室從事計算機科學和軟件?程的研究?作。?對項?中復…

第4章 Vite模塊化與插件系統(二)

4.3 常用插件介紹 4.3.1 官方插件 vitejs/plugin-vue 用于支持 Vue.js 開發&#xff1a; npm install vitejs/plugin-vue --save-devimport vue from vitejs/plugin-vueexport default defineConfig({plugins: [vue()] })vitejs/plugin-react 用于支持 React 開發&#xf…

JavaDS —— 順序表ArrayList

順序表 順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構&#xff0c;一般情況下采用數組存儲。在數組上完成數據的增刪查改。在物理和邏輯上都是連續的。 模擬實現 下面是我們要自己模擬實現的方法&#xff1a; 首先我們要創建一個順序表&#xff0c;順序表…