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 正式打包并发布后测试

bug1

bug2


更多关于uni-app unipush 消息透传创建消息会话导致 ios 崩溃闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

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 对前台通知有严格的权限和触发限制。

问题分析:

  1. iOS 前台通知限制:iOS 要求应用在前台时,若需要显示通知,必须通过用户交互或特定系统事件触发,而不能直接由代码随意创建。你的代码在 receive 事件中立即调用 createMessage,这违反了 iOS 的前台通知策略,可能导致内存访问异常或系统拒绝执行而崩溃。
  2. 消息负载处理msg.payload 是透传消息的原始数据,直接将其字符串化(JSON.stringify(msg.payload))作为 createMessage 的第二个参数(扩展数据),在 iOS 上可能引发序列化问题,尤其是当 payload 包含特殊字符或非标准 JSON 结构时,会触发底层原生模块错误。
  3. 系统兼容性: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), {...});
回到顶部