iOS集成Firebase Cloud Messaging:推送仅显弹窗,如何添角标与提示音?
我来帮你排查这个FCM推送只有弹窗但没声音、角标的问题,结合你已完成的配置,大概率是这几个细节没处理到位:
检查FCM控制台推送的Payload参数
很多时候Firebase控制台默认发送的通知是不带sound和badge字段的,这会导致系统只显示弹窗。你需要在推送时手动添加这些参数:- 进入Firebase控制台的通知发送界面,切换到「高级选项」
- 在「自定义数据」中添加两个键值对:
- 键:
sound,值:default(使用系统默认提示音,若用自定义音频则填文件名) - 键:
badge,值:1(你想要显示的角标数字)
如果你用APNs格式的Payload,要确保包含aps字典,示例如下:
- 键:
{ "aps": { "alert": "测试推送通知", "sound": "default", "badge": 1 } }确认通知权限是否真正被授予
虽然你在代码里设置了UNAuthorizationOptions = [.alert, .badge, .sound],但可能用户首次打开App时拒绝了声音或角标权限。可以加一段代码检查当前权限状态:UNUserNotificationCenter.current().getNotificationSettings { settings in print("当前通知权限:alert:\(settings.alertSetting), sound:\(settings.soundSetting), badge:\(settings.badgeSetting)") }如果输出显示sound或badge为
notAllowed,需要引导用户前往系统设置开启对应权限。完善AppDelegate中的通知处理逻辑
如果你自定义实现了userNotificationCenter(_:willPresent:withCompletionHandler:)方法,一定要在回调里指定要播放声音和更新角标,否则前台推送可能不会触发声音:func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 必须包含.sound和.badge选项 completionHandler([.alert, .sound, .badge]) }另外,后台推送需要开启「远程通知」后台模式:在Xcode的项目Capabilities中,找到Background Modes并勾选Remote notifications。
检查Firebase代理的配置影响
你已经设置了FirebaseAppDelegateProxyEnabled = YES,但有时候这个代理会干扰通知的正常处理。如果前面的方法都无效,可以尝试将该值改为NO,然后手动配置FCM代理:- 在AppDelegate中遵循
MessagingDelegate协议 - 在
didFinishLaunchingWithOptions中添加初始化代码:
FirebaseApp.configure() UNUserNotificationCenter.current().delegate = self Messaging.messaging().delegate = self- 实现Token获取的代理方法(可选但推荐):
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { print("FCM Token: \(fcmToken ?? "")") }- 在AppDelegate中遵循
处理角标重置问题
如果用户点击通知后角标没有自动消失,需要在通知点击回调里手动重置角标:func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { UIApplication.shared.applicationIconBadgeNumber = 0 completionHandler() }
内容的提问来源于stack exchange,提问作者Agung




