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

