收藏
回答

ios config 已成功,updateAppMessageShareData 没有反应?

封装的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也不行

回答关注问题邀请回答
收藏
登录 后发表内容
问题标签