You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS端FCM推送通知无声音问题求助(仅接收data/notification)

iOS FCM推送仅振动无声音问题解决方案

问题分析

从你提供的payload和代码来看,推送无声音的核心问题集中在FCM payload结构混乱以及自定义声音配置流程缺失这两点上。下面分步骤帮你解决:


1. 修正FCM Payload的正确结构

你的payload同时包含了aps、apns.payload.aps、notification.sound多个冗余字段,FCM发送到APNs时会出现优先级冲突,导致声音配置不生效。正确的FCM推送payload(针对iOS)应该遵循以下两种规范之一:

方案A:使用apns.payload配置APNs原生字段

这种方式优先级最高,适合需要精细控制APNs行为的场景:

{
  "content_available": true,
  "priority": "high",
  "data": {
    "title": "abc 2020-07-06 11:20:00",
    "is_background": true,
    "message": "2020-07-06 11:20:00",
    "image": "",
    "payload": {
      "article_data": "",
      "message_id": 21
    },
    "timestamp": "2020-07-08T13:20:00.041Z"
  },
  "apns": {
    "headers": {
      "apns-priority": "10"
    },
    "payload": {
      "aps": {
        "alert": {
          "title": "abc 2020-07-06 11:20:00",
          "subtitle": "2020-07-06 11:20:00",
          "body": "2020-07-06 11:20:00"
        },
        "sound": "default", // 这里配置系统默认声音,自定义声音则替换为文件名
        "badge": 1
      },
      "payload": { // 自定义业务字段放在aps外面
        "article_data": "",
        "message_id": 21
      }
    }
  }
}

方案B:使用FCM的notification字段简化配置

如果不需要复杂的APNs配置,用FCM的notification字段更简洁:

{
  "content_available": true,
  "priority": "high",
  "data": {
    "is_background": true,
    "payload": {
      "article_data": "",
      "message_id": 21
    },
    "timestamp": "2020-07-08T13:20:00.041Z"
  },
  "notification": {
    "title": "abc 2020-07-06 11:20:00",
    "subtitle": "2020-07-06 11:20:00",
    "body": "2020-07-06 11:20:00",
    "sound": "default", // 自定义声音替换为文件名,比如"pixies.wav"
    "badge": 1,
    "click_action": "AboutAssociationActivity"
  }
}

注意:不要同时混用aps根字段和apns.payload.aps,FCM会优先处理apns下的配置,冗余字段会导致冲突。


2. 确认AppDelegate中的通知展示逻辑

你的willPresent方法已经正确设置了completionHandler([.alert, .sound, .badge]),这部分没问题,但需要额外确认:

  • 设备的系统通知声音权限是否开启:进入「设置」→「你的App」→「通知」,确保「声音」选项是打开状态。
  • 测试时设备不要处于静音模式(侧边开关不要拨到静音,音量不要调到最低)。

3. 自定义声音的正确配置步骤

如果要使用自定义声音pixies.wav,必须完成以下步骤:

  1. 声音文件要求:
    • 格式:支持wav、aiff、caf,推荐用caf(压缩率更高)
    • 时长:不超过30秒,否则会被系统忽略
  2. 添加到项目:
    • 将声音文件拖入Xcode项目,勾选「Copy items if needed」,并确保目标App的「Build Phases」→「Copy Bundle Resources」中包含该文件。
  3. Payload中指定文件名:
    将sound字段的值改为文件名(比如"sound": "pixies.wav"),注意要包含文件后缀。
  4. 代码中无需额外设置:你在didReceive方法里设置content.sound是无效的,因为那是点击通知后的逻辑,推送声音是由APNs在推送时触发的,不需要在App内额外配置。

4. 额外检查点

  • 确认Messaging.messaging().apnsToken已经正确设置(你的代码里didRegisterForRemoteNotificationsWithDeviceToken方法已经处理,这部分没问题)。
  • 测试推送时,尽量用FCM控制台发送测试消息,先测试默认声音是否生效,再测试自定义声音,排除后端payload的问题。

内容的提问来源于stack exchange,提问作者Md Tariqul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:47:34