欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解IOS微信上Vue單頁面應用JSSDK簽名失敗解決方案

 更新時間:2018年11月14日 14:29:53   作者:我叫她兜兜  
這篇文章主要介紹了詳解IOS微信上Vue單頁面應用JSSDK簽名失敗解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下

背景

手機型號:

型號:iphone 7 / iphone xs max
版本:ios 10.3.1 / ios 12.1
微信版本:WeChat 6.7.3

問題還原:

Vue應用(vue-router)上使用history模式,在某個頁面內調用微信JSSDK相關API,如掃碼、分享等,使用當前頁面URL總會出現(xiàn)簽名錯誤(invalid signature),導致API調用失敗。

問題根源

Vue-Router進行路由切換的時候,總是會操作瀏覽器的歷史記錄,從而響應頁面URL變化。

在JSSDK文檔頁面有這么一句話:

同一個url僅需調用一次,對于變化url的SPA的web app可在每次url變化時進行調用,目前Android微信客戶端不支持pushState的H5新特性,所以使用pushState來實現(xiàn)web app的頁面會導致簽名失敗,此問題會在Android6.2中修復

但根據(jù)多次測試情況來看,情況恰好相反,在Android下直接使用 window.location.href 得出的URL進行簽名是完全沒問題(可能已升級至Android6.2以上版本),在IOS上就不行了。

這是因為在IOS上,無論路由切換到哪個頁面,實際真正有效的的簽名URL是【第一次進入應用時的URL】。

比如進入應用首頁是: https://m.app.com,需要使用JSSDK的頁面A是:https://m.app.com/product1/123,無論從首頁進入到A頁面之前,中間跳轉過多少次路由,最終簽名有效的URL還是首頁URL。

解決方案

方案一

直接粗暴處理方式:

在進入需要使用JSSDK頁面(B)的前一個頁面(A),即 A > B,直接使用 window.location.href 或 window.open 打開B頁面,此時因為B頁面是直接刷新方式進入,所以當前B頁面URL無論IOS或Android都是可以直接拿來簽名的。

這種方式處理缺點也很明顯,如頁面刷新抖動太厲害不夠平滑過渡,再比如B頁面需要從vuex中取出緩存信息,如果這些緩存信息不是通過vuex保存在localstorage的話,取出來的肯定都是空的。

方案二

思路:既然IOS僅可使用第一次進入應用的URL來簽名,那么在vuex上緩存一個微信簽名URL,IOS保存第一次進入應用的URL,Android則緩存為每個頁面的URL。簽名時,直接從緩存拿出簽名URL來處理。

// 全局判斷是否IOS方法
function isIos(){
 const u = navigator.userAgent;
 return u.indexOf("iPhone") > -1 || u.indexOf("Mac OS") > -1;
}

1. 定義vuex緩存

...

{
 state: {
  wechatSignUrl: ""
 },
 
 mutations: {
  setWechatSignUrl(state, wxSignUrl) {
   // 關鍵點
   // IOS僅記錄第一次進入頁面時的URL
   // IOS微信切換路由實際URL不變,只能使用第一進入頁面的URL進行簽名
   if (isIos() && state.wxSignUrl !== '') {
    return;
   }
   state.wxSignUrl = wxSignUrl;
  }
 },
 
 getters: {
  getWechatSignUrl: (state) => state.wxSignUrl
 }
}

...

關鍵點在于設置更新微信簽名URL判斷的地方:首次進入應用頁面的時候肯定會觸發(fā)更新,若是IOS且簽名URL已經設置過了,那么就不需要更新設置了,只要不退出或刷新應用,緩存永遠都會是首次進入頁面URL。

2. 路由守衛(wèi)內觸發(fā)更新簽名URL

import store form "@/stores"

// 獲取真實有效微信簽名URL
function getWechatSignUrl(to){
  if(isIos()) {
   return window.location.href;
  } else {
   // 此處$appHost需要自行處理
   return $appHost + to.fullPath
  }
}

...
$router.beforeEach((to, from, next) => {
  store.commit("setWechatSignUrl", getWechatSignUrl(to));  
})
...

在路由守衛(wèi)內更新簽名URL,保證IOS是使用當前頁面URL,Android是使用目標路由完整地址再加上域名

3. 使用簽名URL調用JSSDK API

在使用JSSDK API的頁面通過vuex取出緩存的微信簽名URL,然后進行簽名。

比如:

import store form "@/stores"

...
{
 methods: {
  initWechatShareConfig() {
   const that = this;
   const wxSignUrl = store.getters['getWechatSignUrl'];
   const wxShareConfigs = {
    // 微信分享配置
   }

   // 初始化微信分享
   $wechat.share(wxSignUrl, wxShareConfigs);
  }
 }
}
...

$wechat.share 是根據(jù)JSSDK文檔二次封裝的分享方法,內部是根據(jù)wxSignUrl先進行簽名,然后再調用分享API

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Vue中的ref作用詳解(實現(xiàn)DOM的聯(lián)動操作)

    Vue中的ref作用詳解(實現(xiàn)DOM的聯(lián)動操作)

    這篇文章主要介紹了Vue中的ref作用詳解(實現(xiàn)DOM的聯(lián)動操作),需要的朋友可以參考下
    2017-08-08
  • vue基于viewer實現(xiàn)的圖片查看器功能

    vue基于viewer實現(xiàn)的圖片查看器功能

    這篇文章主要介紹了vue基于viewer實現(xiàn)的圖片查看器的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Vue.js組件高級特性實例詳解

    Vue.js組件高級特性實例詳解

    這篇文章主要介紹了Vue.js組件高級特性,結合實例形式詳細分析了vue.js組件遞歸、模板、動態(tài)加載、渲染等相關操作技巧,需要的朋友可以參考下
    2018-12-12
  • react和vue的事件處理差異詳解

    react和vue的事件處理差異詳解

    這篇文章主要介紹了react和vue的事件處理差異,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue自定義組件中v-model的使用方法示例

    Vue自定義組件中v-model的使用方法示例

    日常開發(fā)中除了直接在input標簽上使用v-model指令外,封裝的組件也需要v-model,下面這篇文章主要給大家介紹了關于Vue自定義組件中v-model使用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • vue實現(xiàn)消息列表向上無縫滾動效果

    vue實現(xiàn)消息列表向上無縫滾動效果

    本文主要實現(xiàn)vue項目中,消息列表逐條向上無縫滾動,每條消息展示10秒后再滾動,為了保證用戶能看清消息主題,未使用第三方插件,本文實現(xiàn)方法比較簡約,需要的朋友可以參考下
    2024-06-06
  • Vue利用draggable實現(xiàn)多選拖拽效果

    Vue利用draggable實現(xiàn)多選拖拽效果

    這篇文章主要為大家詳細介紹了如何利用vue中的draggable插件實現(xiàn)多選拖拽效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解django模板與vue.js沖突問題

    詳解django模板與vue.js沖突問題

    在本文里小編給各位整理了關于django模板與vue.js沖突問題以及實例代碼,需要的朋友們參考下。
    2019-07-07
  • 在vue中v-bind使用三目運算符綁定class的實例

    在vue中v-bind使用三目運算符綁定class的實例

    今天小編就為大家分享一篇在vue中v-bind使用三目運算符綁定class的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue3實現(xiàn)地圖選點組件的示例代碼

    Vue3實現(xiàn)地圖選點組件的示例代碼

    這篇文章主要為大家詳細介紹了Vue3實現(xiàn)地圖選點組件的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01

最新評論