uni-app 报Bug uni.onPushMessage点击通知栏推送的消息只有第一次能进入方法内之后无法进入

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app 报Bug uni.onPushMessage点击通知栏推送的消息只有第一次能进入方法内之后无法进入

信息类别 信息内容
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 Windows 10 专业版 22H2
HBuilderX类型 正式
HBuilderX版本号 4.07
手机系统 Android
手机版本号 Android 7.1.1
手机厂商 vivo
手机机型 vivo x9 安卓版本7.1.2
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

onLaunch: function () {  
    console.warn(  
      "当前组件仅支持 uni_modules 目录结构 ,请升级 HBuilderX 到 3.1.0 版本以上!"  
    );  
    console.log("App Launch");  
    uni.onPushMessage((res) => {  
      console.log("收到推送消息:", res); //监听推送消息  
      let { payload } = res.data;  
      let { type, status } = payload;  
      switch (status) {  
        case 1:  
          uni.navigateTo({  
            url: `/pages/message/deviceSos/messageInfo?messageId=${type}&&pageType=${status}`,  
          });  
          break;  
        case 3: // 跳转申请详情  
          uni.navigateTo({  
            url: `/pages/message/application-for-unlocking/apply-info?id=${type}`,  
          });  
          break;  
        case 4: // 跳转审批详情  
          uni.navigateTo({  
            url: `/pages/message/application-for-unlocking/sp-info?id=${type}`,  
          });  
          break;  
        default:  
          break;  
      }  
    });  
  },

操作步骤:

App正常前台打开状态,消息推送来,点击通知栏消息,走不到onPushMessage内,并且执行了俩次AppHide AppShow 13:48:10.783 App Hide at App.vue:45 13:48:10.844 App Show at App.vue:41 13:48:10.883 App Hide at App.vue:45 13:48:10.892 App Show at App.vue:41

预期结果:

app在线推送,无论什么时候点击消息栏消息,都能进入uni.onPushMessage内跳转到各自的页面

实际结果:

app在线推送,点击消息栏消息,没有进入uni.onPushMessage内。并且还执行了俩次AppHide Appshow

bug描述:

app只做了在线推送,使用的uni-push2.0,推送使用云函数推送,服务端增加了force_notification:true。点击通知栏消息只有第一次点击进入了方法,之后都没走进uni.onPushMessage跳转不了页面


3 回复

老铁解决了,遇到了同样的问题


老铁解决了吗,遇到了同样的问题

针对你提到的 uni-appuni.onPushMessage 方法在点击通知栏推送消息时只有第一次能进入方法内,之后无法进入的问题,这通常是由于事件监听器的处理不当或者生命周期管理问题导致的。以下是一些可能的解决方案和代码示例,帮助你排查和修复这个问题。

1. 确保事件监听器正确注册

首先,确保 uni.onPushMessage 是在正确的生命周期内注册的,并且只注册一次。在 uni-app 中,通常应该在 App.vueonLaunchonShow 生命周期钩子中注册。

// App.vue
export default {
  onLaunch() {
    // 确保只注册一次
    if (!this.isPushListenerRegistered) {
      uni.onPushMessage(this.handlePushMessage);
      this.isPushListenerRegistered = true;
    }
  },
  methods: {
    handlePushMessage(res) {
      console.log('收到推送消息:', res);
      // 处理推送消息的逻辑
    }
  },
  data() {
    return {
      isPushListenerRegistered: false // 用于标记是否已注册监听器
    };
  }
};

2. 检查是否有其他代码影响监听器

确认没有其他代码(如条件判断或错误处理)导致 uni.onPushMessage 被意外移除或重置。特别是在应用的不同页面或组件间切换时,要确保监听器的稳定性。

3. 使用全局变量或状态管理

如果应用复杂,考虑使用全局变量或状态管理工具(如 Vuex)来管理推送消息的状态,确保状态更新不会影响事件监听器的行为。

4. 调试和日志记录

增加更多的日志记录,帮助定位问题发生的具体位置。检查是否有异常抛出或错误被捕获但未处理。

handlePushMessage(res) {
  try {
    console.log('收到推送消息:', res);
    // 处理推送消息的逻辑
  } catch (error) {
    console.error('处理推送消息时出错:', error);
  }
}

5. 检查平台特性

不同平台(如微信小程序、H5、App等)对推送消息的处理可能有差异,确保遵循各平台的最佳实践和限制。

总结

上述代码示例和检查点应能帮助你排查 uni.onPushMessage 方法无法多次触发的问题。如果问题依旧存在,可能需要更深入地检查应用的代码逻辑或寻求 uni-app 社区的进一步帮助。

回到顶部