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,必须完成以下步骤:
- 声音文件要求:
- 格式:支持
wav、aiff、caf,推荐用caf(压缩率更高) - 时长:不超过30秒,否则会被系统忽略
- 格式:支持
- 添加到项目:
- 将声音文件拖入Xcode项目,勾选「Copy items if needed」,并确保目标App的「Build Phases」→「Copy Bundle Resources」中包含该文件。
- Payload中指定文件名:
将sound字段的值改为文件名(比如"sound": "pixies.wav"),注意要包含文件后缀。 - 代码中无需额外设置:你在
didReceive方法里设置content.sound是无效的,因为那是点击通知后的逻辑,推送声音是由APNs在推送时触发的,不需要在App内额外配置。
4. 额外检查点
- 确认
Messaging.messaging().apnsToken已经正确设置(你的代码里didRegisterForRemoteNotificationsWithDeviceToken方法已经处理,这部分没问题)。 - 测试推送时,尽量用FCM控制台发送测试消息,先测试默认声音是否生效,再测试自定义声音,排除后端payload的问题。
内容的提问来源于stack exchange,提问作者Md Tariqul Islam
相关产品推荐
相关产品推荐

