上個月,小程序開發內嵌web頁面的功能,這個對于很多微信開發者都是個重大消息。最近兩天,筆者項目中有這樣一個需求,支持小程序內嵌網頁,并且在內嵌網頁中多次跳轉,分享后,點開還是在跳轉之后的網頁。對于這樣一個新技術,還是充滿好奇,既然老大說了要做,那就嘗試去做唄。
首先,當然是參考微信小程序的api。
<web-view src="https://mp.weixin.qq.com/">web-view>
其實使用起來特別簡單,只需在頁面中放入這樣一個標簽即可,其中src一定是要在小程序管理中心配置過的。特別注意一下,web-view會占滿整個頁面,不管這個頁面有什么其它的東西,都不會展示出來。
好了。有了這個可以開始進入需求實現的階段了。對于分享功能,做過小程序開發的都不會陌生,在需要被分享的頁面js中加入onShareAppMessage這樣一個事件即可。
在 Page 中定義 onShareAppMessage 函數,設置該頁面的轉發信息。
只有定義了此事件處理函數,右上角菜單才會顯示 “轉發” 按鈕
用戶點擊轉發按鈕的時候會調用
此事件需要 return 一個 Object,用于自定義轉發內容
Page({ onShareAppMessage: function (res) { if (res.from === 'button') { // 來自頁面內轉發按鈕 console.log(res.target) } return { title: '自定義轉發標題', path: '/page/user?id=123', success: function(res) { // 轉發成功 }, fail: function(res) { // 轉發失敗 } } } })
但是存在web-view時,onShareAppMessage回調函數參數res中還會多一個webViewUrl
Page({ onShareAppMessage(options) { console.log(options.webViewUrl) } })
看了這么多api,心里也有數了,就開始愉快的擼代碼了。很快,內嵌網頁分享的功能就是實現出來了。
onShareAppMessage(options) { var that = this var return_url = options.webViewUrl return { title: that.data.title, path: return_url, success: function (res) { that.web_url = return_url // 轉發成功 wx.showToast({ title: "轉發成功", icon: 'success', duration: 2000 }) }, fail: function (res) { // 轉發失敗 } } },
就在感嘆自己是多么牛x,一下子就搞出來的時候,發現離需求還差一點。需要實現內嵌網頁內多次跳轉分享的功能,這就需要自己想辦法了。在小程序分享中又不能保持狀態,這個得去記錄分享時網頁的路徑。其實有點開發經驗的都能想到這個辦法,那就是使用?在url后記錄下來,這樣在其它用戶打開轉發小程序的時候,取出其中的參數,將web-view中的src替換成這個就行了。話不多說,直接上代碼。
Page({ web_url:"", data: { title: '測試內嵌分享', url:'', web_src:'' }, onShareAppMessage(options) { var that = this var return_url = options.webViewUrl var path = '/page/test/test?return_url=' + encodeURIComponent(return_url) console.log(path, options) return { title: that.data.title, path: path, success: function (res) { that.web_url = return_url // 轉發成功 wx.showToast({ title: "轉發成功", icon: 'success', duration: 2000 }) }, fail: function (res) { // 轉發失敗 } } }, onLoad: function () { var pages=getCurrentPages(); var currentPage = pages[pages.length - 1]; var web_src = decodeURIComponent(currentPage.options.return_url || encodeURIComponent("你的內嵌網頁網址")) this.web_url = web_src this.setData({ web_src: web_src }, function () { }); } })
寫到這里,終于大功告成了。
但是!!!
測試出問題了!!!分享后跳不到想要的頁面!!!
找了n小時的bug,也看不出上面代碼思路和實現有何問題。由于此項技術也剛發布不久,市面上幾乎沒有可以參考的文章,只能自己硬著頭皮找。
找啊找,終于在今天早上找到了這個坑。
由于內嵌網頁是單頁面應用,在手機上測試的時候webViewUrl的獲取每次都會出現問題,只有換成一般的多頁面應用,這個問題才不會發現。
也不知道這是不是個微信的bug,總之需求實現了,還是很開心的。
覺得筆者寫得不錯,可以點個贊噠!!!
如果此文中有不對的地方,歡迎大家指正交流!!!