uni-app 之 web-view 與h5 通訊


  已經很久沒有更新我的博客了,差點要遺忘自己還有博客了,哈哈哈哈。
最近有接觸過關於web-view的東西,大家也知道我一直在做uni-app的項目,也研究了很久,收獲頗豐吧,今天就跟大家分享一下

什么是web-view

  web-view是一個web瀏覽器組件,可以用來承擔網頁的容器,會自動鋪滿整個屏幕
  各小程序平台,web-view 加載的 url 需要在后台配置域名白名單,包括內部再次 iframe 內嵌的其他 url 。
  具體的使用我就不一一介紹了,在官網上都有介紹--->uni-app web-View<---我說點需要注意的地方我以場景來介紹怎樣

APP --- vue頁面與h5頁面通訊

  • src 指的是web-view需要引入的h5頁面,vue頁面模式下,嵌入的頁面會自動鋪滿屏幕,不需要單獨去設置頁面寬高
  • 嵌入的h5項目或者頁面不是uni-app項目搭建的話,需要在index.html頁面或這是當前的HTML頁面引入uni-app項目的API ,這樣才能使用,才能相互通訊--->API
  • app端
        // 引入需要嵌入的h5 鏈接
        <template>
            <view>
                <web-view @message="message" src="https://uniapp.dcloud.io/static/web-view.html"></web-view>
            </view>
        </template>
        //在methods中接收h5發送的消息
        /**
        * @information message中 接收到的是由h5項目通過uni.postMessage中傳遞出來的數據,以數組的形式接收每次的消息
        */
        message(event){
            console.log('接收到消息',event.detail.data)
        }
    
  • h5 項目
        //引入uni-app的api之后 ,只需綁定事件,向APP傳遞消息
        <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
        <script>
            document.addEventListener('UniAppJSBridgeReady', function() {
                uni.postMessage({
                    data: {
                        action: '這是我傳送的消息'
                    }
                });//傳遞的消息信息,必須寫在 data 對象中。
            });
        </script>
    

  這個就是vue與h5 的整個通訊流程,BUT!!!,關鍵來了,注意點來了,就是他不能實時通訊。他只有在頁面 后退,組件銷毀,分享的時候會觸發message事件並接收到消息,說白了就是他並不能實時通訊

解決辦法
  1. 將uni-app項目的編譯模式更改為V3編譯模式,V3編譯模式下,網頁向應用postMessage為實時消息
  2. 將uni-app項目中的使用web-view的vue頁面更改稱為nuve頁面,此時,消息傳遞也為實時通訊,詳細介紹一下nvue與h5頁面通訊

APP --- nvue頁面與h5頁面通訊

  nuve頁面對於web-view來說與vue有點點的不同

  • 樣式來說,nuve中的web-view必須指定寬高,它不像vue一樣會自動鋪滿,需要自己自己規定,但是這個寬高不能‘寫死’,咱們做的是APP端,屏幕不能是‘死’的,所以先獲取手機屏幕信息之后再規定屏幕寬高吧

  • 調試來說,nvue他現在不支持h5 哈,所以通訊這一塊吧,你不能在瀏覽器上面調試,必須真機運行噠

  • 方法來說,為了實時通訊,頁面更換為nvue,相對應的方法也要從@message換成@onPostMessage

        <template>
            <view>
                <web-view @onPostMessage="message"
                :style="{width:'200px', height:'200px'}"
                src="https://uniapp.dcloud.io/static/web-view.html"></web-view>
            </view>
        </template>
    

APP 跳轉頁面

  在h5頁面中引入web-view的方法的基礎上,不但可以像上面一樣進行通訊,還可以在跳轉頁面,達到從嵌入h5跳回到本地應用的頁面上的效果,跳轉頁面的方式與uni-app一致,在h5頁面寫入方法就好

  • uni.navigateTo // 跳轉到指定頁面
  • uni.redirectTo // 關閉當前頁面跳轉到指定頁面
  • uni.reLaunch // 關閉所有頁面跳轉到指定頁面
  • uni.switchTab // 跳轉tab頁面--只能跳轉tab頁
  • uni.navigateBack // 返回頁面層級
注意

  這里有一個沖突點,當web-view嵌入的h5 是uni-app生成的h5資源的話,這樣跳轉要怎么跳轉呢
  使用uni.webView.navigateTo //其中的webView指的是你嵌入的h5的跳轉想要跳轉回應用

小程序 --- vue頁面與h5頁面通訊

  • 小程序的與app一致,引入的h5頁面會自動鋪滿小程序頁面。個人類型與海外類型的小程序暫不支持
  • 小程序的src不變
  • 通訊方法由@message更改為@bindmessage 出發時機依舊為小程序后退,組件銷毀或者分享觸發並接收到消息
  • 引入uni-appAPI之后,再引入微信平台的js文件 --->wx
  • 發送消息方法更改為 wx.miniProgram.postMessage({ data: 'hhh' })
  • 小程序
        <web-view src="http://a.html?id=123"></web-view>
    
  • h5
        <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>
        // javascript
        wx.miniProgram.postMessage({ data: 'hhh' })
        
        //此時接收不到,因為沒有觸發時機,所以可以進行人為操作
        <script type="text/javascript">
            wx.miniProgram.navigateBack({
                delta: 1
            })
            wx.miniProgram.postMessage({
                data: 'foo'
            })
    </script>
    

APP端web-view擴展

 App端的webview是非常強大的,可以更靈活的控制和擁有更豐富的API。

 每個vue頁面,其實都是一個webview,而vue頁面里的web-view組件,其實是webview里的一個子webview。這個子webview被append到父webview上。

 通過以下方法,可以獲得這個web-view組件對應的js對象,然后參考https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewObject,可以進一步重設這個web-view組件的樣式,比如調整大小
<template> <view> <web-view src="https://www.baidu.com"></web-view> </view> </template> <script> var wv;//計划創建的webview export default { onReady() { // #ifdef APP-PLUS var currentWebview = this.$scope.$getAppWebview() //此對象相當於html5plus里的plus.webview.currentWebview()。在uni-app里vue頁面直接使用plus.webview.currentWebview()無效,非v3編譯模式使用this.$mp.page.$getAppWebview() setTimeout(function() { wv = currentWebview.children()[0] wv.setStyle({top:150,height:300}) }, 1000); //如果是頁面初始化調用時,需要延時一下 // #endif } }; </script>

獲取當前環境

  • HTML 在不同的環境下,可能需要執行不同的操作或傳遞不同的消息。可以通過 uni.getEnv() 方法,來獲取當前的環境信息。
        document.addEventListener('UniAppJSBridgeReady', function() {  
            uni.getEnv(function(res) {  
                if (res.plus) {  
                    console.log('當前環境為【5+App】');  
                } else if (res.miniprogram) {  
                    console.log('當前環境為【微信小程序】');  
                }  
            });  
        });
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM