微信分享——ios和安卓機制竟然不同!

以前分享過一篇轉載的微信分享填坑文章vue

基本涵蓋了微信分享功能開發的基本操做。android

實際項目中,在作微信分享追蹤的時候,遇到了一個百思不得其解的問題。ios

在加入了用戶分享追蹤功能以後,頁面已經加載完成的狀況下,安卓分享功能沒有任何問題,ios卻老是分享失敗。後端

關於ios和安卓設備的差異

項目需求是,咱們須要對用戶的分享行爲作追蹤,對用戶從哪一個人分享的連接進來的作記錄。因此每一個用戶有一個惟一的分享碼。瀏覽器

用戶A分享出去,連接上帶有他本身的分享碼。 用戶B點進連接的一瞬間,把當前url上的分享碼傳給後端作記錄,同時替換上本身的分享碼。bash

我使用替換參數的方式是直接修改router的query服務器

this.$router.push({
  name: 'routername'       //當前路由名稱
  query: {
    sharecode: 'sharecode'   //修改後的sharecode
  }
})
複製代碼

加上追蹤記錄以後,卻發現安卓設備可以分享成功,也能拿到正確的記錄。可是ios老是分享失敗,就算切換到其餘頁面也依然沒法分享,只有在刷新頁面後才能分享成功。。。微信

amazing...微信開發

如何和後端交互

簽名是後端和微信服務器作的事情,我要作的就是把要作簽名的url傳給後端。框架

作法很簡單,就是監聽路由變化(只變化了參數也須要監聽),每次變化時給後端傳url。

由於無論從什麼渠道點入咱們的連接,都會有分享碼生成並加在路由上,致使一開始頁面就會觸發兩次路由變化;並且,若是用戶沒有登錄的話微信爸爸還會強行跳轉受權,致使頁面重載一次,因此若是一個用戶沒有登錄,那頁面會觸發4次路由變化!那就須要和後端交互四次。

不能忍!

最後商議的是,默認進入頁面的第一次不作記錄 ,這樣首屏最多隻須要交互2次(劃重點,後面要考)

以上故事在告訴咱們人爲何要做死

好了咱們回到ios分享失敗的問題上

解決過程

chorme瀏覽器調試模式沒發現毛病,微信開發者工具也沒發現有問題,就是在ios真機上出現了這個bug。(微信開發者工具竟然是一個披着ios外衣的android??dev環境是ios,表現行爲卻和安卓一毛同樣)

千辛萬苦線上線下調試,最後發現是真機上在用本身的分享碼替換別人分享碼的這個步驟出現了問題。

安卓設備可以正常替換sharecode參數,可是ios卻沒有替換成功。後端作簽名使用的url是拼接sharecode替換後的連接,因此致使簽名和路由匹配不上。

確認使用路由參數替換的方法沒有問題,由於安卓環境可以正常替換。因此ios環境該怎麼辦??

這就引伸出了一個問題:vue框架下ios如何在當前頁面替換路由參數??

最後是很不優雅的強行重載 - -,相信我會找到解決辦法的 > _ <

就這樣第一天結束了 ——————————時間到了次日———————————— 繼續填坑

重載這麼噁心的方法固然不行了,不要虛繼續幹

索性把全部的url都alert出來。

而後,在ios上發現了一個神奇的現象

  1. 點擊一個連接,好比http:example.com/a&share=111
  2. ios中彈出當前url沒有問題http:example.com/a&share=111,緊接着下一步執行替換分享碼操做,將share替換成222,即理論上url會變成http:example.com/a&share=222
  3. 按照昨天的邏輯,share不會被替換,能夠彈出url發現,被替換了!當前url的確是http:example.com/a&share=222
  4. 此時再執行分享操做,同時複製當前url。
  5. 分享失敗!粘貼剛剛複製的url,share依然是111!wtf !?

ok,緊接着我進行了下一步操做

  1. 我頻繁切換的個人路徑,跳到c又跳到d,等等,alert出來的url也隨着個人切換進行了變化。
  2. 在c或者d頁面執行分享操做,同時複製當前url。
  3. 分享失敗!粘貼剛剛複製的url,share依然是111!(你沒看串行,就是和上面一毛同樣)

以上現象能夠得出一個結論,在ios環境下(安卓分享正常因此沒有測試是否是也有一樣的行爲),若是簽名驗證失敗,那麼無論路由如何變化,不只分享自己不會成功,並且分享出去的路由永遠都是第一次加載時的路由。

後來查閱資料才發現,ios的簽名驗證機制和安卓不同。

  • 安卓:對須要分享的每一個頁面路由作簽名,並加載頁面分享信息
  • ios: 只須要對第一次進來的頁面路由作簽名,對每一個要分享的頁面加載分享信息

這說明了啥,ios環境下,微信只認第一次進來的路由啊!

讓咱們再把和後端交互部分的重點重複一遍:默認進入頁面的第一次不作記錄 ,這樣首屏最多隻須要交互2次

不記錄你個大頭貼

最後,判斷環境是ios的時候,老老實實把第一次的路由給記上。

你問我那ios環境下的首屏最多須要加載4次啦?

認真聽講的小朋友,獎勵你一朵大紅花~

可是!ios只認第一次的路由,我只須要傳第一次路由給後端就行,監聽路由變化都!不!用!了!(微笑)

掘金主頁:如意同窗

簡書主頁:如意同窗

b站直播地址,每週五晚不按期直播,偶爾寫代碼,偶爾讀書,偶爾看學習視頻,偶爾乾點亂七八糟的(反正和學習有關),歡迎一塊兒學習!yo~

相關文章
相關標籤/搜索