如果前端项目使用的history模式的路由,当第一次打开的是首页或者其他页面,然后跳转到活动页面,再调用wx.config
进行签名验证时,会签名验证失败。因为ios端的js-sdk在验证签名时取到的是第一次打开的页面地址,而不是当前的地址。
在官方文档有提到这一点,但是对于IOS的问题是一个字也没提到。
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)。
解决方案
- 在项目初始化的时候,如果在ios环境,则把当前页面的url缓存起来。
- 活动页面在获取签名的时候,去读取缓存的url,如果读不到则用当前页面的url。
- 获取到签名后再调用
wx.config
函数。
经过测试,是可以多次重复调用 wx.config
的,重点就是在ios端调用的时候,签名要传打开的第一个页面url。
举个🌰,我这边是 uni-app 的,就在 onLaunch
生命周期里缓存初始页面url。
javascript
export default {
onLaunch: function (option) {
// #ifdef H5
// 如果当前设备是ios
if (global.SystemInfo.platform === "ios") {
// 缓存初始页面url
global._wxsdkUrl = window.location.href.split("#")[0]
}
// #endif
}
}
然后在活动页面获取签名调用 wx.config
时,这么写
javascript
// 初始化微信js-sdk
async initWx(){
// 先尝试获取ios的缓存url,获取不到就取当前页面的url
let url = global._wxsdkUrl || window.location.href.split("#")[0]
// 调用后端接口获取签名
const res = await getWxJsSdkSign({url: url})
wxsdk.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: res.appId, // 必填,公众号的唯一标识
timestamp: res.timestamp, // 必填,生成签名的时间戳
nonceStr: res.nonceStr, // 必填,生成签名的随机串
signature: res.signature,// 必填,签名
jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData'] // 必填,需要使用的JS接口列表
});
}