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

如何在AppDelegate外发起Firebase Cloud Messaging(FCM)通知授权请求?

在iOS中实现Firebase Cloud Messaging(FCM)通知权限请求

当咱们要在iOS应用里集成FCM推送功能时,第一步必须要向用户请求通知权限。根据Firebase官方文档的建议,咱们应该把权限请求的代码放在AppDelegate的didFinishLaunchingWithOptions方法里,下面是完整的实现示例:

import UIKit
import Firebase
import UserNotifications // iOS 10+ 需要导入该框架

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 初始化Firebase服务
        FirebaseApp.configure()
        
        // 分版本处理通知权限请求
        if #available(iOS 10.0, *) {
            // iOS 10及以上版本的权限请求逻辑
            let notificationCenter = UNUserNotificationCenter.current()
            notificationCenter.delegate = self
            // 请求弹窗、声音、角标三种通知权限
            notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
                if let error = error {
                    print("请求通知权限出错:\(error.localizedDescription)")
                    return
                }
                if granted {
                    print("用户已授权通知权限")
                    // 注册远程通知,获取设备令牌
                    application.registerForRemoteNotifications()
                } else {
                    print("用户拒绝了通知权限")
                }
            }
        } else {
            // iOS 9及以下版本的权限请求逻辑
            let notificationSettings = UIUserNotificationSettings(types: [.alert, .sound, .badge], categories: nil)
            application.registerUserNotificationSettings(notificationSettings)
            application.registerForRemoteNotifications()
        }
        
        return true
    }
    
    // iOS 9及以下版本,监听权限请求结果
    func application(_ application: UIApplication, didRegisterUserNotificationSettings settings: UIUserNotificationSettings) {
        if settings.types != .none {
            application.registerForRemoteNotifications()
        }
    }
    
    // 成功获取设备令牌的回调,需将令牌同步给Firebase
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print("FCM设备令牌:\(tokenString)")
        Messaging.messaging().apnsToken = deviceToken
    }
    
    // 注册远程通知失败的回调
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("注册远程通知失败:\(error.localizedDescription)")
    }
    
    // iOS 10+ 前台收到通知时的处理逻辑
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // 自定义前台通知的展示方式,这里保留弹窗、声音、角标
        completionHandler([.alert, .sound, .badge])
    }
}

关键细节说明:

  • Firebase初始化:FirebaseApp.configure()必须放在权限请求之前,确保Firebase服务正常启动
  • 权限类型调整:你可以根据业务需求,修改权限选项(比如只请求.sound权限)
  • 设备令牌作用:获取到的设备令牌是FCM定向推送消息的核心标识,一定要同步给Firebase
  • 版本兼容:代码做了iOS版本判断,同时覆盖高、低版本系统的权限请求逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:03:39