首先說明,應用環境是使用的是vue+vue-router,history模式開發的單頁應用。html
先上配置???vue
// index.js const protocol = location.protocol + '//' + location.host; router.afterEach((to, from) => { if(!store.state.weChatUrl) { store.commit('m_weChatUrl', document.URL); } let url = protocol + to.fullPath.split('#')[0]; store.dispatch('a_wxConfig', url);// 每一個頁面都調用微信受權配置 }); // action.js if(window.__wxjs_is_wkwebview === true) { urlType = 0; } else { urlType = 1; } $get(...).then(item => { config = JSON.parse(item); $wechat.config(config); $wechat.ready(function () {}) }) // 注:$wechat是我在webpack external暴露的wx接口
這份配置主要是根據vue微信公衆號開發踩坑記錄(2)配置而來。html5
有些頗有趣的現象:webpack
debug
模式的結果基本都是:config ok
,CheckJsApi: permission Denied
正是這些現象把我帶偏了半個地球,好不容易纔試出來問題的所在。ios
秀一波我曾經懷疑過的問題:git
懷疑過這些問題的能夠不用懷疑了,通過個人百般折騰,終於在這篇博客???關於html5-History模式在微信瀏覽器內的問題 發現了一點曙光:github
修改後的代碼以下web
setTimeout(function () { $wechat.config(config); }, 500);
簡直不要過高興,竟然能夠啦!!!!vue-router
其實細想一下config ok
卻會發生permission Denied
已經給出了問題所在了,可是奇怪的現象太多了,想法就饒了半個地球了。
讓我來解析一下爲何config ok
卻會發生permission Denied
的報錯。
因爲在afterEach調用config的時候,頁面的路由仍是上一個頁面的路由,config的url也是上一個頁面的路由,因此config是ok的。可是到調用API的時候,afterEach多數已經resolve了,因此頁面的路由也已經改變了,也就是當前調用api的路由跟config的路由不一致,因此微信就判斷permission Denied了segmentfault
用了上面延遲後的config以後,ios分享的每一個頁面進去的都是首頁。這是要折騰死個人節奏啊?????。幸虧我只改了這延遲這一個地方,因此我很容易地就肯定,確定是afterEach在ios跟Android的處理是不同的,因此把ios改回原來不延遲的config就妥妥滴好了
if (window.__wxjs_is_wkwebview === true) { $wechat.config(config); } else { setTimeout(function () { $wechat.config(config); }, 500); }
因爲是單頁應用,頁面不會刷新,因此微信分享一旦定義了,wx變量就會一直存在於系統運行內存中,天然就是每一個頁面分享的內容就是定義過的就不奇怪了。
解決辦法,在afterEach裏面,定義每一個路由默認的分享標題和描述,若是組件須要再在獨立的vue組件裏面從新定義一篇分享的API便可
$wechat.onMenuShareTimeline({ title: state.title, // 分享標題 success: function () { // 用戶確認分享後執行的回調函數 } }); $wechat.onMenuShareAppMessage({ title: state.title, // 分享標題 type: '', // 分享類型,music、video或link,不填默認爲link dataUrl: '', // 若是type是music或video,則要提供數據連接,默認爲空 success: function () { // 用戶確認分享後執行的回調函數 }, cancel: function () { // 用戶取消分享後執行的回調函數 } });