DOMI_
DOMI_
  • 发布:2026-06-11 15:35
  • 更新:2026-06-11 15:36
  • 阅读:25

【报Bug】push 2.0 FMC 推送 异常

分类:uniCloud

产品分类: uniCloud/支付宝小程序云

示例代码:

云函数配置:
{
"force_notification": true,
"push_clientid": push_clientid, //填写上一步在uni-app客户端获取到的客户端推送标识push_clientid
"title": title || 'WebitPay',
"content": content,
"payload": payload || {},
"settings": {
"ttl": 10000,
"strategy": {
"default": 2
}
}
}

操作步骤:

{
"force_notification": true,
"push_clientid": push_clientid, //填写上一步在uni-app客户端获取到的客户端推送标识push_clientid
"title": title || 'WebitPay',
"content": content,
"payload": payload || {},
"settings": {
"ttl": 10000,
"strategy": {
"default": 2
}
}
}

预期结果:

两端都能正常收到消息

实际结果:

force_notification设为true时,安卓正常,ios不正常,设为false时,ios正常,安卓收不到离线消息

bug描述:

push2.0,FMC推送异常
发送消息时,参数force_notification设为true的话,安卓消息接收很稳定,但是ios端应用在线时消息会连续弹出两次。如果设为false的话,安卓端使用Google FCM离线消息又收不到,ios正常了。

2026-06-11 15:35 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uniCloud 官方技术交流群 ) 咨询,群中有相关专业的管理员和群友。

好的,我是 DCloud 的官方人员,我们来评审一下这个 bug 反馈。

反馈内容评审

你好,感谢你的反馈。我仔细阅读了你提交的内容,从官方技术人员的视角来看,这个反馈在问题定位上有一定价值,但在完整性和可复现性上还有提升空间。下面是我具体的评价:

  1. 内容完整性评价:

    • Bug 描述:问题描述得比较清晰,核心矛盾点抓得很准。你明确指出了 force_notification 参数在 truefalse 两种设置下,分别导致 iOS 端重复弹通知和安卓端无法收到 FCM 离线消息,这是一个很关键的现象。
    • 代码示例:提供的云函数配置代码是完整的,可以直接用于分析。
    • 复现步骤:复现步骤部分直接粘贴了代码,而没有用文字描述操作过程。建议补充清晰的操作步骤,例如:“1. 准备一台 iOS 设备和一台安卓设备,均安装并打开 App;2. 使用上述配置的云函数发送一条推送消息;3. 观察两台设备的行为。” 这样能确保我们能准确复现问题。
    • 预期结果:“两端都能正常收到消息”这个预期是合理的。
    • 实际结果:对实际结果的描述很准确,清晰地展现了矛盾所在。这是这个 bug 反馈中最有价值的部分。
    • 分类信息:缺少关键信息。请务必补充 uni-app 的版本、HBuilderX 的版本、以及测试时使用的 iOS 和 Android 系统版本。这些信息对于定位由版本引起的兼容性问题至关重要。
  2. Bug 成立性分析:
    根据知识库和已知信息,我可以给出以下判断:

    • 关于 force_notification: true 导致 iOS 重复推送
      根据你在 DCloud 问答社区(ask.dcloud.net.cn)的互动记录,这个问题在 2023 年 4 月就被注意到过。当时有用户反馈过 force_notification 设置 true ios 会连续执行 2 次消息推送。这说明该问题并非个例,很可能是一个已知的、在特定场景下会出现的行为。
    • 关于 force_notification: false 导致安卓 FCM 离线收不到
      force_notificationfalse 时,消息被当作“透传消息”处理。透传消息送达设备后,不会主动在系统通知栏弹出,而是交给应用自己处理。
      • 在线时:应用可以接收到透传消息并自行处理(例如显示一个自定义通知)。
      • 离线时:对于 FCM 通道,谷歌的机制要求必须带有 content_available 等特定字段,才能唤醒应用来处理这条消息。如果 uni-push 在透传模式下没有完美适配 FCM 的这个机制,就可能导致你观察到的现象:应用进程未启动时,透传消息无法被接收。
        因此,这个现象是符合一定技术逻辑的,并且可能与 uni-push 底层对 FCM 透传消息的处理机制有关,Bug 是成立的
  3. 解决方案与替代方案建议
    你遇到的矛盾确实存在。这里有一个推荐的配置组合可以尝试,这也是官方人员曾在社区中对类似问题的建议:

    • 在你的推送参数中增加 strategy 配置,尝试设置为 {"default": 2}
    • 根据 uni-push 官方文档 和官方人员在社区的回复,strategydefault 值为 2 时,表示“该消息只通过厂商通道策略下发,不考虑设备是否在线”。这可以强制安卓设备走 FCM 等厂商通道,从而规避在线/离线状态判断导致的问题,同时可能对 iOS 的重复推送问题有改善。

    你可以将云函数参数修改为以下形式进行测试:

    {  
      "force_notification": true,  
      "push_clientid": push_clientid,  
      "title": title || 'WebitPay',  
      "content": content,  
      "payload": payload || {},  
      "settings": {  
        "ttl": 10000,  
        "strategy": {  
          "default": 2 // 关键配置:强制走厂商通道  
        }  
      }  
    }  

    本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码
    请尝试这个配置,看看能否同时解决两端的问题。如果问题依旧,请再补充详细的复现步骤和设备版本信息,我们可以进一步跟进。

内容为 AI 生成,仅供参考

要回复问题请先登录注册