You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS集成Firebase Cloud Messaging:推送仅显弹窗,如何添角标与提示音?

iOS FCM推送无提示音、角标问题排查方案

我来帮你排查这个FCM推送只有弹窗但没声音、角标的问题,结合你已完成的配置,大概率是这几个细节没处理到位:

  • 检查FCM控制台推送的Payload参数
    很多时候Firebase控制台默认发送的通知是不带soundbadge字段的,这会导致系统只显示弹窗。你需要在推送时手动添加这些参数:

    1. 进入Firebase控制台的通知发送界面,切换到「高级选项」
    2. 在「自定义数据」中添加两个键值对:
      • 键: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代理:

    1. 在AppDelegate中遵循MessagingDelegate协议
    2. didFinishLaunchingWithOptions中添加初始化代码:
    FirebaseApp.configure()
    UNUserNotificationCenter.current().delegate = self
    Messaging.messaging().delegate = self
    
    1. 实现Token获取的代理方法(可选但推荐):
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("FCM Token: \(fcmToken ?? "")")
    }
    
  • 处理角标重置问题
    如果用户点击通知后角标没有自动消失,需要在通知点击回调里手动重置角标:

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        UIApplication.shared.applicationIconBadgeNumber = 0
        completionHandler()
    }
    

内容的提问来源于stack exchange,提问作者Agung

火山引擎 最新活动