uni-app unipush 消息透传创建消息会话导致 ios 崩溃闪退
uni-app unipush 消息透传创建消息会话导致 ios 崩溃闪退
示例代码:
//监听接收透传消息事件
plus.push.addEventListener('receive', (msg) => {
//处理透传消息的业务逻辑代码
if (uni.getSystemInfoSync().platform == 'ios') {
// 通知栏消息 问题在这里
plus.push.createMessage(msg.payload.content, JSON.stringify(msg.payload), {
title: msg.payload.title,
cover: false
})
} else {
// 语音播报
let token = msg.payload.token
let content = msg.payload.content
_this.audio(content, token)
}
// plus.nativeUI.alert("receive:---" + "token:" + token + '----content:' + content+JSON.stringify(msg.payload))
// uni.$emit('uni_push', msg)
}, false)
操作步骤:
下载app后 使用测试账号登录-》我的-》打开 ‘我的收款码’, 使用另一个手机扫码后随便付款0.01元,即可出现。。
预期结果:
收到消息通知后 app正常使用 不出现崩溃
实际结果:
收到消息通知后崩溃
bug描述:
- ios 14.8 版本与 ios 15 版本都有出现这样的问题
- hbuliderX 版本: 3.2.9
- 测试方式:正式打包并发布后测试
- bug: 当app在前台运行时 ,收到消息推送后 马上会崩溃
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| hbuliderX | 3.2.9 | 正式打包并发布后测试 |


更多关于uni-app unipush 消息透传创建消息会话导致 ios 崩溃闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html
hbuilder 版本3.2.9
更多关于uni-app unipush 消息透传创建消息会话导致 ios 崩溃闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html
问题已经解决 !!!
导致问题原因: 因为plus.push.createMessage创建消息时 会 触发一次 透传’receive‘,所以导致死循环
解决办法: 判断一下msg.payload.content 是否为空,第一次推送时后台会有内容,但是创建消息时触发的透传时没有内容的,所有有内容就创建 无内容就不创建即可
那是你女朋友吗,蛮漂亮的
大家都是来看问题的
请问在哪个步骤判断msg.payload.content是否为空,我这边判断了,但没起左右,能发下这个代码吗
根据你提供的代码和描述,这个问题很可能与 iOS 前台消息处理机制有关。在 iOS 系统中,当应用在前台运行时,直接调用 plus.push.createMessage 创建本地通知可能会导致崩溃,因为 iOS 对前台通知有严格的权限和触发限制。
问题分析:
- iOS 前台通知限制:iOS 要求应用在前台时,若需要显示通知,必须通过用户交互或特定系统事件触发,而不能直接由代码随意创建。你的代码在
receive事件中立即调用createMessage,这违反了 iOS 的前台通知策略,可能导致内存访问异常或系统拒绝执行而崩溃。 - 消息负载处理:
msg.payload是透传消息的原始数据,直接将其字符串化(JSON.stringify(msg.payload))作为createMessage的第二个参数(扩展数据),在 iOS 上可能引发序列化问题,尤其是当payload包含特殊字符或非标准 JSON 结构时,会触发底层原生模块错误。 - 系统兼容性:iOS 14+ 版本加强了通知权限管理,应用在前台时,未经用户授权或未使用适当 API(如
UNUserNotificationCenter)处理通知,容易导致闪退。崩溃日志中的内存地址错误(如0x0000000104e4c7a4)通常指向原生层异常,可能是 UniPush 模块与 iOS 系统交互时发生冲突。
建议解决方案:
- 移除前台通知创建:在 iOS 端,当应用在前台时,避免直接调用
plus.push.createMessage显示通知。可以改为静默处理透传消息(如更新应用内界面),或仅在后台/退出状态时创建通知。修改代码逻辑,区分应用状态:if (uni.getSystemInfoSync().platform == 'ios') { // 检查应用是否在前台 if (plus.runtime.isApplicationRunning) { // 前台:不创建通知,改为其他处理(如更新UI) console.log('前台透传消息:', msg.payload); uni.$emit('uni_push', msg); // 触发应用内事件 } else { // 后台或退出:创建通知 plus.push.createMessage(msg.payload.content, JSON.stringify(msg.payload), { title: msg.payload.title, cover: false }); } } - 简化负载数据:确保
msg.payload是纯 JSON 对象,避免包含循环引用或非序列化内容。如果不需要完整负载,可以只传递关键字段:const payload = { title: msg.payload.title, content: msg.payload.content }; // 提取必要字段 plus.push.createMessage(msg.payload.content, JSON.stringify(payload), {...});

