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
相关产品推荐
相关产品推荐

