基于IOS端微信分享失效的踩坑及解決方法
最近的一個(gè)公眾號(hào)是基于vue的spa應(yīng)用,在接入微信分享和微信語(yǔ)音的時(shí)候出現(xiàn)了:在Android上一切正常,但是在ios端調(diào)用wx.config的時(shí)候總是失敗,去翻了官方文檔也并沒(méi)有找到解決方案,最后在測(cè)試中發(fā)現(xiàn)是因?yàn)槌跏蓟臅r(shí)候傳入的URL的問(wèn)題。具體過(guò)程如下:
微信config接口配置,官方文檔如下:
所有需要使用JS-SDK的頁(yè)面必須先注入配置信息,否則將無(wú)法調(diào)用(同一個(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ù))。
官方明確給出SPA在每次url變化時(shí)進(jìn)行調(diào)用,于是我們的最初代碼如下:
// 此處在main.js中,在vue-router每次改變路由的時(shí)候去調(diào)用wx.config router.beforeEach((to, from, next) => { let url =`www.example.com`; let getConfig = async function(url) { // res為后端接口中返回的config const res = await get_config(url); wx.config(res); console.log(res); }; }) // 此部分為微信分享 var config = { title: 'title', // 分享標(biāo)題 desc: 'desc', // 分享描述 link: 'link', // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁(yè)面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 imgUrl: `image', success: function() { console.log(success) }, cancel: function() { console.log(failf) } }; wx.ready(() => { wx.onMenuShareAppMessage(config); wx.onMenuShareTimeline(config); });
上邊的代碼在安卓端運(yùn)行時(shí)一切正常。
但是我們測(cè)試的時(shí)候在IOS端分享等功能全部失效,后來(lái)我們仔細(xì)排查,發(fā)現(xiàn)是在初始化config的問(wèn)題,
我們發(fā)現(xiàn)在IOS端只需要在==網(wǎng)站根目錄中初始化一次即可==,所以我們對(duì)代碼進(jìn)行了修改,如下:
1、先判斷當(dāng)前環(huán)境
//通過(guò)userAgent判斷IOS環(huán)境 let isIOS = function() { var isIphone = navigator.userAgent.includes('iPhone'); var isIpad = navigator.userAgent.includes('iPad'); return isIphone || isIpad; }; // 如果是IOS系統(tǒng),則只在根路徑初始化config if (isIOS()) { if (to.path === '/') { getConfig(url); next(); } else { next(); } } else { getConfig(url); next(); }
最終我們的代碼如下:
router.beforeEach((to, from, next) => { let url = `*****`; let getConfig = async function(url) { const res = await get_config(url); wx.config(res); console.log(res); }; let isIOS = function() { var isIphone = navigator .userAgent .includes('iPhone'); var isIpad = navigator .userAgent .includes('iPad'); return isIphone || isIpad; }; var config = { title: '*****', // 分享標(biāo)題 desc: '******', // 分享描述 link: '***************', // 分享鏈接,該鏈接域名或路徑必須與當(dāng)前頁(yè)面對(duì)應(yīng)的公眾號(hào)JS安全域名一致 imgUrl: `*****`, type: 'link', dataUrl: '', success: function() {}, cancel: function() {} }; wx.ready(() => { wx.onMenuShareAppMessage(config); wx.onMenuShareTimeline(config); }); if (isIOS()) { if (to.path === '/') { getConfig(url); next(); } else { next(); } } else { getConfig(url); next(); } });
“*”部分為開(kāi)發(fā)者自定義內(nèi)容
最坑爹的是微信文檔并沒(méi)有提及關(guān)于IOS初始化的問(wèn)題(或者是我沒(méi)有找到)。囧
通過(guò)如上修改以后,我們的公眾號(hào)在IOS和android端的分享功能都可以正常的跑起來(lái)啦。
以上這篇基于IOS端微信分享失效的踩坑及解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CAMediaTiming ( 時(shí)間協(xié)議)詳解及實(shí)例代碼
這篇文章主要介紹了CAMediaTiming / 時(shí)間協(xié)議詳解及實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼,幫助大家學(xué)習(xí)參考,需要的朋友可以參考下2016-12-12實(shí)例解析iOS app開(kāi)發(fā)中音頻文件播放工具類(lèi)的封裝
這篇文章主要介紹了iOS app開(kāi)發(fā)中音頻文件播放工具類(lèi)的封裝,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01Swift Self詳解及簡(jiǎn)單實(shí)例代碼
這篇文章主要介紹了Swift Self詳解及簡(jiǎn)單實(shí)例代碼的相關(guān)資料,這里對(duì)self 進(jìn)行了詳細(xì)介紹并附實(shí)例代碼,需要的朋友可以參考下2016-12-12iOS開(kāi)發(fā)自定義頁(yè)腳和頁(yè)眉技巧詳解
這篇文章主要為大家介紹了iOS開(kāi)發(fā)自定義頁(yè)腳和頁(yè)眉的技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07ios常見(jiàn)加密解密方法(RSA、DES 、AES、MD5)
本篇文章主要介紹了ios常見(jiàn)加密解密方法(RSA、DES 、AES、MD5),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02詳解iOS開(kāi)發(fā)中UITableview cell 頂部空白的多種設(shè)置方法
這篇文章主要介紹了詳解iOS開(kāi)發(fā)中UITableview cell 頂部空白的多種設(shè)置方法的相關(guān)資料,需要的朋友可以參考下2016-04-04Objective-C中利用正則去除非數(shù)字字母漢字方法實(shí)例
正則表達(dá)式對(duì)我們?nèi)粘i_(kāi)發(fā)來(lái)說(shuō)是必不可少的,下面這篇文章主要給大家介紹了關(guān)于Objective-C中如何利用正則去除非數(shù)字字母漢字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06