首先聲明是vue的spa項目h5調用wxjssdk時發生的問題,
我們大多剛開始做微信分享時,就會按照微信官方文檔上一步一步做,先從后端拿到微信初始化需要配置的數據,然后調用wx的config方法,wxconfig調用成功后,會一步執行
wx的ready方法,那么我們在自定義分享內容時,就是在ready方法后做的,當然也可以將配置自定義分享的內容寫在ready方法外面。這些都是最基本的操作。
需要跟大家提個醒的是,要弄清楚config方法和ready方法的關系,只有正確配置config之后,wx會自動調用ready方法,注意這個是異步的,相當於ready是config的回調函數,只不過,這個ready是微信單獨暴露出來的方法。
下面進入正題,我做分享時,在需要做分享的頁面,都執行了以下步驟:
1、向后端獲取微信需要配置信息(appid、簽名什么的),要確保獲取的信息正確,然后再配置config時,才不會配置失敗。
2、config成功后,會調用ready方法,(可以將自定義分享的一些配置信息,當成一個回調函數傳進這個方法內,一些異步的問題需要自己根據實際情況解決)
3、在ready方法執行好之后,將自定義分享的配置信息 讓它執行
以上就是最基本的微信分享步驟,在安卓手機上沒一點點問題,很正常,
但是到ios手機上,怎么都分享不出來,查了查百度,有一問網友和我遇到的問題分廠一樣,看了看它的描述,和我的很類似。
在ios端,vue的spa項目,微信初始化只能在項目入口初始化一次,(只能在項目入口初始化微信!,且只能初始化一次!,ios端!)
那么,我現在需要將微信的初始化方法需要提到 項目的入口執行(因為只有在ios端有這個問題,所以我只針對了ios端做了調整,其它安卓還讓它在頁面內初始化微信),
接下來需要,整理一下思路,我在項目入口時,當時ios的微信環境時,讓微信初始化一次,那么到頁面內,ios端的微信環境就不需要初始化微信環境了(這個要注意),那么頁面里面我們也需要做判斷,如果是非ios的微信環境,就讓微信直接初始化,按正常步驟執行就行。
說了這么多,vue頁面的入口到底在哪?這里用到了路由守衛 from.path=='/'是,就認為他是項目入口
看實際代碼:
router.beforeEach((to, from, next) => { if (tools.isIOS()) {//針對ios端 微信初始化 if (from.path === '/') {//項目入口 if(wxSharecfgList.includes(to.name)){//需要使用分享的頁面 let huiyiId=to.query.huiyiId; if(tools.isWeiXin()&&!tools.isPC()){//不是pc端並且是微信環境 WXAPI.getWxConfig(function(){//config方法是寫在一個單獨的js文件里的,這是暴露出來的方法,具體的自己看情況編寫就行 store.commit("setWxReadyOk",false); store.commit("setWxReadyOk",true);//告訴頁面其它地方 微信初始化完成 },huiyiId); } } } } }
頁面內也給出一個參考代碼:
self.shareToWxFriend(self.personInfo.huiyiCn,self.personInfo.realName);//安卓環境下,先執行config再在ready方法中 自定義配置分享信息 self.pageInfoOk=true;//標記頁面信息已經拿到 if(tools.isIOS()){//如果是ios端 設置微信分享配置信息 注意這里的微信config是在入口初始化的,下面只需要判斷微信環境初始化成功再自定義分享內容就行了 if(self.pageInfoOk&&self.wxReadyOk){//頁面數據拿到並且wx環境初始化成功 self.wxShareCfg(self.personInfo.huiyiCn,self.personInfo.realName) } }
上面就是解決微信在ios端,分享失效的方法以及思路,當然 認真的朋友也注意到,我解決微信初始化和頁面數據加載異步的解決方法,就是用兩個變量,一個代表微信初始化成功,一個代表頁面數據加載成功,這個判斷需要在獲取頁面數據的異步方法中調用,也需要在微信初始化成功的異步方法中調用,因為我們不能保證那個先完成。
下面再來看一下,我是如何在頁面監聽 微信初始化成功的:
watch: { wxReadyOk:{ handler(newVal){ if(this.pageInfoOk&&newVal){//頁面數據拿到並且wx環境初始化成功 this.wxShareCfg(this.personInfo.huiyiCn,this.personInfo.realName); } }, immediate:true, } }, computed: { wxReadyOk(){ return this.$store.getters.getWxReadyOk; } },
好了,問題已解決,文章寫的比較粗糙,但是如果真正遇到這個問題的人看到,肯定會有幫助。
。