小程序web-view關閉后,頁面音頻沒有關閉


 

問題描述:

web-view的src中,引入了一個HTML5頁面,這個頁面有個自動播放的音頻。
在小程序中,點擊右上角關閉小程序后,web-view頁面中的音頻依然會播放。

期待現象

期待關閉小程序之后,音頻也停止。

通過查找文檔,發現沒有直接提供方法,網上找了一圈之后,嘗試的方案也都無法實現。

所以我這里想到的思路是,當用戶關閉小程序時,應該銷毀掉web-view。可惜,目前沒有這個接口。

所以我就利用了模擬的方式來實現,當前小程序頁面onHide時,就將web-view的頁面src屬性清空。

后來經過測試發現,在ios平台下,需要制定一個url,在android平台下只需要清空。另外為了防止造成緩存,給url后面添加了一個隨機的參數。

以下是代碼片段。



<template>
    <view>
         <web-view :src="webUrl"></web-view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                webUrl: 'https://demo.com/weixin/index.html'
            }
        },
        onLoad() {
        },
        onHide(){
            // webview關閉后,刷新url。否則會造成音樂在后台繼續播放的bug
            if (wx.getSystemInfoSync().platform == "ios") {
                this.webUrl = 'https://demo.com/weixin/index.html?redirect=true';
            }else{
                // android系統下只能給空值
                this.webUrl = ';'
            }
        },
        onBackPress(){
        },
        methods: {
            
        }
    }
</script>

<style>
</style>

 

以上代碼是通過uni-app開發的。如果在微信開發者工具中編輯,需要符合微信小程序的語法。

2019年6月2日 更新

經過測試,發現以上代碼並不是最好的選擇。因為當用戶隱藏小程序后,在最近使用的小程序中,該小程序會繼續在后台保留一段時間。如果是替換web-view的url,會造成音樂繼續播放。

另外一個問題就是,我以上代碼判斷了ios和andorid兩個平台。其實現在想來並不需要。

綜上所述,以上代碼參考意義並不大,請使用監聽hashchange 方式來判斷。代碼如下:

小程序中代碼



<view class="page-body">
  <view class="page-section page-section-gap">
    <web-view src="https://demo.com/weixin/index.html#show={{showed}}"></web-view>
  </view>
</view>

Page({
    data: {
        showed: false
    },
    // 小程序在前台
    onShow: function(){
        this.setData({
            showed: true
        });
    },
    // 小程序在后台
    onHide: function() {
        this.setData({
            showed: false
        });
    }
})

 

web-view中代碼

window.addEventListener("hashchange", () => {
        var globalAudio = document.getElementById("player"); //獲取audio HTMLDOM
        const hashData = parseURL(window.location.hash.slice(1));
        if (hashData.show) {
            const isShow = hashData.show === 'true';
            if (isShow) { //切到前台
                if (globalAudio.paused) {
                    globalAudio.play();
                }
            } else {  //切到后台
                if (globalAudio.play) {
                    globalAudio.pause();
                }
            }
        }
    }, false);

  
    function parseURL(e) {
        var t, n, r, i = e, s = {};
        t = i.split("&"),
        r = null,
        n = null;
        for (var o in t) {
            var u = t[o].indexOf("=");
            u !== -1 && (r = t[o].substr(0, u),
            n = t[o].substr(u + 1),
            s[r] = n)
        }
        return s
    }

** 總結 **

  • 通過onShowonHide設置屬性showed的值,來判斷用戶的小程序是在前台還是后台。
  • 因為是給web-viewsrc動態修改hash值,所以不會造成頁面刷新,相比直接修改src會更好。
  • 然后在web-view所在的頁面中,監聽hashchange事件,在事件中,判斷hash屬性showtrue false值,空值音樂的暫停與播放。

2019年6月6日 更新

本來以為監聽hash值的變化,已經是能完美的解決這個問題了。但是經過測試之后,發現了嚴重的問題:安卓系統下,用戶點擊物理返回按鍵,會無法退出小程序

這個問題造成的原因是:每次修改hash值時候,都會添加一條歷史瀏覽記錄。而用戶點擊返回按鈕時,就相當於點擊瀏覽器的返回按鈕。自然就是會返回多次才能回到第一頁,然后才退出掉小程序。

這樣的話,用戶體驗就非常不好。我首先想到的是,調用wx.miniProgram.navigateBack,直接返回。但是會報一個錯誤:


意思就是說,我當前的web-view是第一頁,不能再返回了。

最后還是通過閱讀微信文檔,發現了onPageStateChange這個監聽事件。可以判斷微信小程序是否在前台。我最開始的時候,測試過這個接口,當時當時微信客戶端沒有升級,所以我一直以為這個接口是不能用的呢。

其實這個接口是完全可以用的。只不過需要微信版本在7.0.3

這樣的話,就可以將代碼優化得非常少了。

// wxml
<view>
    <web-view src="https://demo.com/weixin/index.html"></web-view>
</view>
// 微信中的js
Page({
   
})
// web-view頁面中的js
wx.ready(function() {
        var globalAudio = document.getElementById("player"); //獲取audio HTMLDOM
        WeixinJSBridge.on('onPageStateChange', function(res) {
            // 注意:res.active返回的是字符串類型的true和false
            if(res.active == 'true'){
                globalAudio.play();
            }else{
                globalAudio.pause();
            }
        });
        
}); 

 

主要就是,不在采用監聽hash值的變化了,直接使用微信提供的接口。非常好用。

 

 

 

 

 

轉 : https://www.jianshu.com/p/fb8a7250900d

 


免責聲明!

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



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