如何在iOS应用处于前台时显示Firebase推送通知
实现iOS前台显示Firebase推送通知横幅的完整方案
我来帮你搞定这个问题!其实你已经找对了核心方法,不过可能需要把整个流程补全,确保所有配置都到位。下面是完整的实现步骤和代码示例:
1. 确保正确设置通知中心代理
首先,你需要在App启动时把UNUserNotificationCenter的代理设置为当前类(比如AppDelegate或者SceneDelegate,取决于你的项目结构)。
代码示例(AppDelegate):
import UIKit import Firebase import UserNotifications @main class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() // 设置通知中心代理 UNUserNotificationCenter.current().delegate = self // 设置Firebase Messaging代理 Messaging.messaging().delegate = self // 请求通知权限 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in guard granted else { return } DispatchQueue.main.async { application.registerForRemoteNotifications() } } return true } // 其他AppDelegate生命周期方法... }
2. 完善willPresent代理方法
你之前写的willPresent方法是核心,这里补充完整版本,确保适配不同iOS版本,同时明确控制通知显示样式:
// 当App在前台收到通知时触发 func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { // 指定要显示的通知样式:alert(原生横幅)+ sound(提示音)+ badge(角标更新) // 如果你只需要横幅,保留.alert即可 let presentationOptions: UNNotificationPresentationOptions if #available(iOS 14.0, *) { // iOS14+支持更多显示选项,这里保持原生横幅样式 presentationOptions = [.alert, .sound, .badge] } else { presentationOptions = [.alert, .sound, .badge] } completionHandler(presentationOptions) } // 处理用户点击通知的回调(你已实现的方法可直接保留) func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { // 这里可以添加点击通知后的自定义逻辑,比如跳转指定页面 print("用户点击了通知:\(response.notification.request.content.title)") completionHandler() }
3. 额外的Firebase配置(可选但重要)
如果你的推送通过Firebase Cloud Messaging(FCM)发送,建议补充实现MessagingDelegate的令牌获取方法,方便后续定向推送:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { print("FCM设备令牌:\(fcmToken ?? "")") // 可将令牌上传至你的服务器,用于给特定设备推送通知 }
测试注意事项
- 一定要用真机测试,模拟器的推送功能有限,可能无法正常显示前台横幅
- 确保推送payload包含
alert字段,示例格式:{ "aps": { "alert": { "title": "测试通知", "body": "这是前台显示的原生通知横幅" }, "sound": "default" } } - 确认用户已在系统设置中为你的App开启通知权限
这样配置完成后,你的App在前台运行时,就能收到和后台完全一致的原生iOS通知横幅啦!
内容的提问来源于stack exchange,提问作者Pankaj Mundra




