app在前台运行时接收到一条推送在uni-app中弹出了2个通知栏同时走了离线推送和在线推送的逻辑

app在前台运行时接收到一条推送在uni-app中弹出了2个通知栏同时走了离线推送和在线推送的逻辑

开发环境 版本号 项目创建方式
Mac MacOS26 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

PC开发环境操作系统版本号:MacOS26

HBuilderX类型:正式

HBuilderX版本号:4.75

手机系统:iOS

手机系统版本号:iOS 26

手机厂商:苹果

手机机型:iPhone16ProMax

页面类型:vue

vue版本:vue3

打包方式:云端

项目创建方式:HBuilderX

示例代码:

App.vue内实现的监听推送代码

onLaunch((ctx) => {  
  console.log('App Launch 启动')  
  // 监听消息推送  
  uni.onPushMessage((res) => {  
    console.log('个推 pushMessage', res)  
    if (res.type === 'click') {  
      // 后台推送,跳转到动态页  
      uni.switchTab({  
        url: '/pages/status/index',  
      })  
    } else if (res.type === 'receive') {  
      // 在前台需要自己创建通知栏消息  
      uni.createPushMessage({  
        title: res.data.title,  
        content: res.data.content,  
        payload: res.data.payload,  
        success: (res) => {  
          console.log('创建通知栏消息成功', res)  
        },  
        fail: (err) => {  
          console.log('创建通知栏消息失败', err)  
        },  
      })  
    }  
    // 将app角标置为0  
    plus.runtime.setBadgeNumber(0)  
  })  
})

操作步骤:

App.vue内监听推送,app停留在前台,后端给app发一条推送

预期结果:

App.vue内监听到推送后,手动创建通知栏(在线推送的逻辑)

实际结果:

App.vue内监听到推送后,即出现了手动创建的通知栏(在线推送的逻辑),又出现了系统创建的通知栏(离线推送的逻辑)。

bug描述:

app在前台运行,接收到一条推送,结果同时走了“离线推送”和“在线推送”的逻辑,导致手机上1条推送出现了2个通知栏。

后端推送参数 force_notification:0 (不自动创建通知栏)。从视频里2个通知栏的标题来看(分别是“尾巴信标”、“设备提醒”),一个是“离线推送”时系统创建的通知栏,一个是“在线推送”app内部手动创建的通知栏。


更多关于app在前台运行时接收到一条推送在uni-app中弹出了2个通知栏同时走了离线推送和在线推送的逻辑的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

该bug反馈内容完整,描述了问题现象、环境信息、代码示例及复现步骤。代码示例清晰展示了onLaunch中监听推送并手动创建通知栏的逻辑,可直接复现。预期结果合理:根据文档,当force_notification:0且应用在前台时,应仅触发在线推送逻辑(需手动创建通知栏),不应出现系统自动创建的通知栏。
bug成立。依据知识库:

在线推送定义明确说明"app在前台打开运行时,通过个推渠道下发消息",此时客户端应直接监听到消息内容
离线推送机制指出"当应用被用户关闭或运行到后台时"才会触发厂商通道推送
关键文档说明"当应用在线时,不会创建’通知栏消息’",但实际出现了双通知栏,表明系统错误触发了离线推送逻辑

问题可能源于iOS平台特殊性:即使App在前台,iOS系统仍可能通过APNs通道下发消息,导致unipush SDK同时走在线/离线双通道。用户使用的iOS 26(测试版)可能存在系统级变更影响推送行为。建议检查:

是否正确配置了iOS推送证书
尝试升级至最新HBuilderX正式版(当前4.75非最新)
在onPushMessage回调中增加type判断逻辑,避免重复创建通知栏

此非概念性误报,属真实推送通道处理异常,需结合iOS平台特性排查。 内容为 AI 生成,仅供参考

更多关于app在前台运行时接收到一条推送在uni-app中弹出了2个通知栏同时走了离线推送和在线推送的逻辑的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这个问题是由于uni-app推送机制中在线和离线推送逻辑同时触发导致的。当应用在前台运行时,系统推送通道和uni-app的在线推送监听会同时响应。

核心原因

  1. 离线推送:即使应用在前台,系统推送服务(APNs)仍会收到推送消息并自动创建通知栏
  2. 在线推送uni.onPushMessage监听到推送后,你的代码又手动创建了一次通知栏

解决方案

修改App.vue中的推送监听逻辑,区分应用状态:

onLaunch((ctx) => {
  console.log('App Launch 启动')
  
  // 监听消息推送
  uni.onPushMessage((res) => {
    console.log('个推 pushMessage', res)
    
    // 获取应用当前状态
    const appState = plus.push.getClientInfo().client.appState
    
    if (res.type === 'click') {
      // 点击通知栏进入应用
      uni.switchTab({
        url: '/pages/status/index',
      })
    } else if (res.type === 'receive') {
      // 仅当应用在前台时才手动创建通知栏
      if (appState === 'foreground') {
        uni.createPushMessage({
          title: res.data.title,
          content: res.data.content,
          payload: res.data.payload,
          success: (res) => {
            console.log('创建通知栏消息成功', res)
          },
          fail: (err) => {
            console.log('创建通知栏消息失败', err)
          },
        })
      }
      // 应用在后台时,依赖系统自动创建通知栏
    }
    
    // 将app角标置为0
    plus.runtime.setBadgeNumber(0)
  })
})
回到顶部