收藏
回答

miniProgram为什么在安卓真机调试时候从wei-view跳转回小程序页面不生效?

// 声明全局 wx 对象类型
declare global {
  interface Window {
    wx?: {
      miniProgram: {
        navigateTo: (options: { 
          url: string;
          success?: () => void;
          fail?: (error: any) => void;
        }) => void;
        redirectTo: (options: { 
          url: string;
          success?: () => void;
          fail?: (error: any) => void;
        }) => void;
      };
    };
    __wxjs_environment?: string;
  }
}


// 判断是否为安卓设备
export const isAndroid = () => {
  return /android/i.test(navigator.userAgent.toLowerCase());
};


// 判断是否在小程序环境中
export const isInMiniProgram = () => {
  try {
    return window.wx && typeof window.wx.miniProgram !== 'undefined';
  } catch (e) {
    return false;
  }
};


export const backToMiniProgram = (url: string, query: any) => {
  // 判断是否在小程序环境中
  const queryString = Object.entries(query)
    .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)
    .join('&');
  const fullUrl = queryString ? `${url}?${queryString}` : url;


  if (isInMiniProgram()) {
    // 安卓设备特殊处理
    if (isAndroid()) {
      console.log('安卓设备特殊处理:延迟500ms执行跳转');
      // 增加延迟时间,确保环境准备就绪
      setTimeout(() => {
        try {
          if (window.wx?.miniProgram) {
            window.wx.miniProgram.navigateTo({
              url: fullUrl,
              success: () => {
                console.log('跳转成功');
              },
              fail: (error) => {
                console.error('跳转失败:', error);
                // 尝试使用 redirectTo 作为备选方案
                window.wx?.miniProgram.redirectTo({
                  url: fullUrl,
                  fail: (redirectError) => {
                    console.error('redirectTo 也失败:', redirectError);
                    alert('跳转失败,请稍后重试');
                  }
                });
              }
            });
          } else {
            console.error('wx.miniProgram 未定义');
            alert('当前环境不支持跳转');
          }
        } catch (error) {
          console.error('跳转过程发生错误:', error);
          alert('跳转失败,请稍后重试');
        }
      }, 500);
    } else {
      // iOS或其他设备正常处理
      try {
        window.wx?.miniProgram.navigateTo({
          url: fullUrl,
          success: () => {
            console.log('跳转成功');
          },
          fail: (error) => {
            console.error('跳转失败:', error);
            alert('跳转失败,请稍后重试');
          }
        });
      } catch (error) {
        console.error('跳转过程发生错误:', error);
        alert('跳转失败,请稍后重试');
      }
    }
  } 
  // 判断是否在 uni-app webview 中
  else if (window.parent) {
    try {
      // 向父级 uni-app 发送消息
      window.parent.postMessage({
        type: 'navigateTo',
        data: {
          url: fullUrl
        }
      }, '*');
    } catch (error) {
      console.error('跳转失败:', error);
      alert('跳转失败,请稍后重试');
    }
  } else {
    alert("当前环境不支持跳转");
  }
};

const handleOrderPay = () => {
    submitOrder({
      productId: selectedSku?.productId,
    })
      .then((res) => {
        backToMiniProgram("/pages/sub-order-detail/order-pay/order-pay", {
          scene: res.data.orderNo,
          payNow: true,
        });
      })
      .catch((err) => {
        Toast.show({
          content: "下单失败",
          icon: "fail",
        });
      });
  };

ios真机调试都可以正常,开发者工具也可以正常跳转,就是安卓手机真机调试不行,更换了两个手机测试了都不能跳转,直接提示‘下单失败’
回答关注问题邀请回答
收藏

1 个回答

  • Geefib
    Geefib
    05-19

    路径最前面加多一个 / 试试

    05-19
    有用 1
    回复 2
    • Dy🐳
      Dy🐳
      05-19
      backToMiniProgram("/pages/sub-order-detail/order-pay/order-pay", 这里不是有/吗?再加一个刚才测试了开发者工具都不能正常跳转回去了
      05-19
      回复
    • Geefib
      Geefib
      05-19
      我之前遇到的是pages/sub-order-detail/order-pay/order-pay少了/。
      window.wx.miniProgram.navigateTo({
                    url:"/pages/sub-order-detail/order-pay/order-pay"});

      直接调可以吗?
      05-19
      回复
登录 后发表内容