You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在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

火山引擎 最新活动