封装的initWx
import request from '@/utils/request';
import { APPID } from '@/constant/env';
import wx from 'jweixin-npm';
export interface JsConfigQO {
appId?: string;
nonceStr?: string;
timestamp?: string | number;
url?: string;
configType?: 0 | 1;
}
export async function getJsSDKConfig(jsConfigQo: JsConfigQO) {
return request({
method: 'POST',
data: jsConfigQo,
url: '/wechat/jsapi/config',
baseURL: process.env.WECHAT_URL,
});
}
const initWx = async () => {
return new Promise((resolve, reject) => {
wxConfig(resolve, reject, 3);
});
};
const wxConfig = (resolve: any, reject: any, retryNum: number) => {
let isErr = false;
let url: any = window.location.href?.split('#')[0];
if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {
url = sessionStorage.getItem('wxEntryUrl');
}
if (navigator.userAgent.includes('wechatdevtools')) url = '';
getJsSDKConfig({
url: url || window.location.href?.split('#')[0],
appId: APPID,
configType: 0,
}).then((config: any) => {
wx.config({
debug: process.env.NODE_ENV === 'development', // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
appId: config.data.appId, // 必填,公众号的唯一标识
timestamp: parseInt(config.data.timestamp), // 必填,生成签名的时间戳
nonceStr: config.data.nonceStr, // 必填,生成签名的随机串
signature: config.data.signature, // 必填,签名
jsApiList: [
'closeWindow',
'updateAppMessageShareData',
'updateTimelineShareData',
'onMenuShareAppMessage',
'getLocation',
], // 必填,需要使用的JS接口列表
openTagList: ['wx-open-launch-weapp', 'wx-open-launch-app'],
});
wx.ready(() => {
if (!isErr) {
console.log(`个微sdk config 第${4 - retryNum}次success`);
resolve('success');
}
});
wx.error((err: any) => {
isErr = true;
if (err.realAuthUrl && err.realAuthUrl[0] && retryNum > 0) {
console.log(
`个微sdk config 第${4 - retryNum}次error,ios需传入口页`,
err,
);
sessionStorage.setItem('wxEntryUrl', err.realAuthUrl[0]);
wxConfig(resolve, reject, retryNum - 1);
} else {
console.error('个微sdk config error,未知原因', err);
reject(err);
}
});
});
};
export default initWx;
调用的地方
useEffect(() => {
initWx().then(() => {
console.log(11)
wx.updateAppMessageShareData({
...wxShareData,
success: (res: any) => {
console.log(15, 'success', res);
},
});
});
}, []);
ios第一次进入打印结果顺序
个微sdk config 第1次error,ios需传入口页
个微sdk config 第2次success
11
结果就是 wx.updateAppMessageShareData 没有任何反应,分享也是失败的。这是为什么?
但是如果在 wx.ready 里面延迟 resolve 又可以成功
wx.ready(() => {
if (!isErr) {
console.log(`个微sdk config 第${4 - retryNum}次success`);
if (retryNum === 3) {
resolve('success');
} else {
setTimeout(() => {
resolve('success');
}, 300);
}
}
});
打印顺序
ios第一次进入打印结果顺序
个微sdk config 第1次error,ios需传入口页
个微sdk config 第2次success
11
15, 'success', errMsg: "updateAppMessageShareData:ok
为什么 ios 在config失败后再次重试成功后要延迟一段时间才可以 调用 updateAppMessageShareData:ok,试过延迟10ms也不行