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

Swift项目Firebase推送通知无声音和角标问题求助

问题分析与解决方案

1. 推送Payload缺失关键字段(核心原因)

你看到notification.request.content.sound和badge为nil,说明推送的原始Payload里根本没有包含这两个字段——代码里的权限请求和Presentation配置只是允许App显示这些内容,但如果推送本身没带相关参数,系统自然无法触发提示音和角标。

针对FCM推送,必须确保Payload符合APNs规范,示例Payload如下:

{
  "to": "你的FCM_TOKEN",
  "aps": {
    "alert": {
      "title": "通知标题",
      "body": "通知内容"
    },
    "badge": 1, // 角标数字,设置为0可清除角标
    "sound": "default" // 使用系统默认提示音,也可以自定义音频文件名
  },
  "data": {
    // 自定义业务数据
  }
}

如果是通过Firebase控制台发送测试通知,需要在高级选项里手动添加字段:

  • 点击「添加自定义数据」,键填badge,值填数字(比如1)
  • 键填sound,值填default

2. 修正代码中的PresentationOptions写法

你的willPresent方法里返回的是双层数组[[.alert, .badge, .sound]],虽然Swift会自动转换为UNNotificationPresentationOptions,但正确的写法应该是单层数组,避免潜在问题:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
    let userInfo = notification.request.content.userInfo
    print(userInfo)
    return [.alert, .badge, .sound] // 修正为单层数组
}

3. 验证用户授权状态

虽然你请求了权限,但要确认用户实际授予了权限。可以在didFinishLaunchingWithOptions里添加权限检查代码:

UNUserNotificationCenter.current().getNotificationSettings { settings in
    print("当前通知权限状态: \(settings.authorizationStatus)")
    print("Sound权限: \(settings.soundSetting)")
    print("Badge权限: \(settings.badgeSetting)")
    if settings.authorizationStatus != .authorized {
        // 提示用户前往系统设置开启通知权限
    }
}

4. 后台推送的特殊处理

当App处于后台或未启动状态时,willPresent方法不会触发,通知的显示完全依赖Payload中的aps字段,所以必须确保Payload里的badge和sound字段正确配置,否则系统不会显示角标和播放提示音。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:48