微信分享—ios和安卓機制居然不一樣!

  • 2019 年 10 月 26 日
  • 筆記

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

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

關於ios和安卓設備的差別

項目需求是,我們需要對用戶的分享行為做追蹤,對用戶從哪個人分享的鏈接進來的做記錄。所以每個用戶有一個唯一的分享碼。

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

我使用替換參數的方式是直接修改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只認第一次的路由,我只需要傳第一次路由給後端就行,監聽路由變化都不用了!