最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解IOS微信上Vue單頁(yè)面應(yīng)用JSSDK簽名失敗解決方案

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

背景

手機(jī)型號(hào):

型號(hào):iphone 7 / iphone xs max
版本:ios 10.3.1 / ios 12.1
微信版本:WeChat 6.7.3

問(wèn)題還原:

Vue應(yīng)用(vue-router)上使用history模式,在某個(gè)頁(yè)面內(nèi)調(diào)用微信JSSDK相關(guān)API,如掃碼、分享等,使用當(dāng)前頁(yè)面URL總會(huì)出現(xiàn)簽名錯(cuò)誤(invalid signature),導(dǎo)致API調(diào)用失敗。

問(wèn)題根源

Vue-Router進(jìn)行路由切換的時(shí)候,總是會(huì)操作瀏覽器的歷史記錄,從而響應(yīng)頁(yè)面URL變化。

在JSSDK文檔頁(yè)面有這么一句話(huà):

同一個(gè)url僅需調(diào)用一次,對(duì)于變化url的SPA的web app可在每次url變化時(shí)進(jìn)行調(diào)用,目前Android微信客戶(hù)端不支持pushState的H5新特性,所以使用pushState來(lái)實(shí)現(xiàn)web app的頁(yè)面會(huì)導(dǎo)致簽名失敗,此問(wèn)題會(huì)在Android6.2中修復(fù)

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

這是因?yàn)樵贗OS上,無(wú)論路由切換到哪個(gè)頁(yè)面,實(shí)際真正有效的的簽名URL是【第一次進(jìn)入應(yīng)用時(shí)的URL】。

比如進(jìn)入應(yīng)用首頁(yè)是: https://m.app.com,需要使用JSSDK的頁(yè)面A是:https://m.app.com/product1/123,無(wú)論從首頁(yè)進(jìn)入到A頁(yè)面之前,中間跳轉(zhuǎn)過(guò)多少次路由,最終簽名有效的URL還是首頁(yè)URL。

解決方案

方案一

直接粗暴處理方式:

在進(jìn)入需要使用JSSDK頁(yè)面(B)的前一個(gè)頁(yè)面(A),即 A > B,直接使用 window.location.href 或 window.open 打開(kāi)B頁(yè)面,此時(shí)因?yàn)锽頁(yè)面是直接刷新方式進(jìn)入,所以當(dāng)前B頁(yè)面URL無(wú)論IOS或Android都是可以直接拿來(lái)簽名的。

這種方式處理缺點(diǎn)也很明顯,如頁(yè)面刷新抖動(dòng)太厲害不夠平滑過(guò)渡,再比如B頁(yè)面需要從vuex中取出緩存信息,如果這些緩存信息不是通過(guò)vuex保存在localstorage的話(huà),取出來(lái)的肯定都是空的。

方案二

思路:既然IOS僅可使用第一次進(jìn)入應(yīng)用的URL來(lái)簽名,那么在vuex上緩存一個(gè)微信簽名URL,IOS保存第一次進(jìn)入應(yīng)用的URL,Android則緩存為每個(gè)頁(yè)面的URL。簽名時(shí),直接從緩存拿出簽名URL來(lái)處理。

// 全局判斷是否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) {
   // 關(guān)鍵點(diǎn)
   // IOS僅記錄第一次進(jìn)入頁(yè)面時(shí)的URL
   // IOS微信切換路由實(shí)際URL不變,只能使用第一進(jìn)入頁(yè)面的URL進(jìn)行簽名
   if (isIos() && state.wxSignUrl !== '') {
    return;
   }
   state.wxSignUrl = wxSignUrl;
  }
 },
 
 getters: {
  getWechatSignUrl: (state) => state.wxSignUrl
 }
}

...

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

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

import store form "@/stores"

// 獲取真實(shí)有效微信簽名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)內(nèi)更新簽名URL,保證IOS是使用當(dāng)前頁(yè)面URL,Android是使用目標(biāo)路由完整地址再加上域名

3. 使用簽名URL調(diào)用JSSDK API

在使用JSSDK API的頁(yè)面通過(guò)vuex取出緩存的微信簽名URL,然后進(jìn)行簽名。

比如:

import store form "@/stores"

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • el-select如何獲取下拉框選中l(wèi)abel和value的值

    el-select如何獲取下拉框選中l(wèi)abel和value的值

    在開(kāi)發(fā)業(yè)務(wù)場(chǎng)景中我們通常遇到一些奇怪的需求,例如el-select業(yè)務(wù)場(chǎng)景需要同時(shí)獲取我們選中的label跟 value,下面這篇文章主要給大家介紹了關(guān)于el-select如何獲取下拉框選中l(wèi)abel和value的值,需要的朋友可以參考下
    2022-10-10
  • vue?vue-esign簽字板的demo

    vue?vue-esign簽字板的demo

    這篇文章主要介紹了vue?vue-esign簽字板的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue?3?effect作用與原理解析

    vue?3?effect作用與原理解析

    Vue3的Effect是其響應(yīng)式系統(tǒng)的核心,負(fù)責(zé)依賴(lài)追蹤和自動(dòng)響應(yīng),它通過(guò)ReactiveEffect類(lèi)封裝副作用邏輯,實(shí)現(xiàn)依賴(lài)收集和觸發(fā)更新,本文介紹vue?3?effect作用與原理解析,感興趣的朋友一起看看吧
    2025-02-02
  • vue中實(shí)現(xiàn)高德定位功能

    vue中實(shí)現(xiàn)高德定位功能

    這篇文章主要介紹了vue中實(shí)現(xiàn)高德定位功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • vue-router 2.0 跳轉(zhuǎn)之router.push()用法說(shuō)明

    vue-router 2.0 跳轉(zhuǎn)之router.push()用法說(shuō)明

    這篇文章主要介紹了vue-router 2.0 跳轉(zhuǎn)之router.push()用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • 詳解Vue中watch的高級(jí)用法

    詳解Vue中watch的高級(jí)用法

    我們通過(guò)實(shí)例代碼給大家分享了Vue中watch的高級(jí)用法,對(duì)此知識(shí)點(diǎn)有需要的朋友可以跟著學(xué)習(xí)下。
    2018-05-05
  • vue+uniapp實(shí)現(xiàn)生成二維碼

    vue+uniapp實(shí)現(xiàn)生成二維碼

    這篇文章主要為大家詳細(xì)介紹了vue結(jié)合uniapp實(shí)現(xiàn)生成二維碼的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • vue3+ts實(shí)現(xiàn)一個(gè)表單組件的詳細(xì)代碼

    vue3+ts實(shí)現(xiàn)一個(gè)表單組件的詳細(xì)代碼

    這篇文章主要介紹了vue3+ts實(shí)現(xiàn)一個(gè)表單組件的詳細(xì)代碼,確保通過(guò)axios調(diào)用后端接口來(lái)獲取省市區(qū)和街道數(shù)據(jù),并在選擇省市區(qū)時(shí)加載相應(yīng)的街道數(shù)據(jù),需要的朋友可以參考下
    2024-07-07
  • vue實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)顯示懸浮框效果

    vue實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)顯示懸浮框效果

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)顯示懸浮框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • vxe-table?使用?vxe-upload?在表格中實(shí)現(xiàn)非常強(qiáng)大的粘貼上傳圖片和附件功能

    vxe-table?使用?vxe-upload?在表格中實(shí)現(xiàn)非常強(qiáng)大的粘貼上傳圖片和附件功能

    本文通過(guò)實(shí)例代碼介紹了vxe-table渲染器的強(qiáng)大功能,配合 vxe-upload 上傳,比如復(fù)制或者截圖一張圖片,通過(guò)粘貼方式快速粘貼到單元格中,能支持單張、多張、查看、預(yù)覽功能,感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評(píng)論

沈丘县| 神木县| 开鲁县| 南漳县| 桃江县| 合作市| 朝阳市| 宁陵县| 九寨沟县| 建昌县| 津市市| 舞阳县| 南宫市| 个旧市| 玉林市| 长子县| 平武县| 东山县| 贺兰县| 新干县| 成都市| 岫岩| 鄂温| 库伦旗| 桃园市| 探索| 锦屏县| 河南省| 普安县| 淮南市| 应城市| 伊春市| 孙吴县| 黄冈市| 江陵县| 随州市| 平谷区| 威海市| 莆田市| 固阳县| 宁城县|