uni-app 报Bug uni.onPushMessage点击通知栏推送的消息只有第一次能进入方法内之后无法进入
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跳转不了页面
老铁解决了,遇到了同样的问题
老铁解决了吗,遇到了同样的问题
针对你提到的 uni-app
中 uni.onPushMessage
方法在点击通知栏推送消息时只有第一次能进入方法内,之后无法进入的问题,这通常是由于事件监听器的处理不当或者生命周期管理问题导致的。以下是一些可能的解决方案和代码示例,帮助你排查和修复这个问题。
1. 确保事件监听器正确注册
首先,确保 uni.onPushMessage
是在正确的生命周期内注册的,并且只注册一次。在 uni-app
中,通常应该在 App.vue
的 onLaunch
或 onShow
生命周期钩子中注册。
// 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
社区的进一步帮助。