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

iOS设备接收FCM推送通知但不显示的问题求助

FCM推送通知配置后的验证与代码优化指南

嘿,看你已经搞定了FCM推送的基础配置流程,这步子迈得很稳!结合你给出的AppDelegate代码框架,我整理了几个关键的验证点和代码完善建议,帮你把推送功能彻底跑通:

1. 补全AppDelegate核心回调实现

你已经正确继承了UNUserNotificationCenterDelegate和MessagingDelegate,接下来需要补全关键的初始化和回调代码,这是FCM推送生效的核心:

完整的启动配置与Token获取代码

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 配置用户通知中心
        UNUserNotificationCenter.current().delegate = self
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { granted, error in
            guard granted else { 
                print("用户未授予推送权限")
                return 
            }
            DispatchQueue.main.async {
                application.registerForRemoteNotifications()
            }
        }
        
        // 初始化FCM并设置代理
        Messaging.messaging().delegate = self
        FirebaseApp.configure()
        
        return true
    }

    // 成功注册APNS后获取设备Token,同步给FCM
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        // 转换为字符串方便查看或上传到服务器
        let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
        print("APNS设备Token: \(tokenString)")
    }

    // 获取FCM注册Token,用于定向推送
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        guard let token = fcmToken else { 
            print("FCM Token获取失败")
            return 
        }
        print("FCM注册Token: \(token)")
        // 建议将此Token上传到你的后端服务,用于给特定用户发推送
    }
}

2. 处理不同状态下的通知回调

要确保App在前台、后台甚至被杀死状态下都能正确接收和响应通知,需要补全以下代理方法:

前台通知展示与点击处理

// iOS 10+ 前台收到通知时的回调(控制是否弹出通知)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    // 允许前台弹出通知的样式,按需调整
    completionHandler([.alert, .badge, .sound])
    // 解析通知内容做自定义处理
    let userInfo = notification.request.content.userInfo
    print("前台收到通知内容: \(userInfo)")
}

// 点击通知后的回调(无论App处于什么状态)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    print("用户点击了通知: \(userInfo)")
    // 这里可以添加跳转页面、打开指定功能等自定义逻辑
    completionHandler()
}

3. 关键配置的二次验证

虽然你已经完成了基础配置,但还是建议再核对以下细节,避免踩坑:

  • 确认Info.plist中添加了FirebaseAppDelegateProxyEnabled并设置为YES(如果是通过Firebase自动配置文件导入的话,这一步会自动完成)
  • 检查后台模式:除了开启“远程通知”,如果需要接收静默推送,还要开启“后台获取”
  • 验证.p12证书:确保证书在有效期内,上传到Firebase控制台时输入的密码完全匹配,且开发/生产环境的证书不要搞混
  • 测试设备的iOS版本建议在10以上,适配最新的UserNotifications框架

4. 测试推送的实用技巧

  • 使用Firebase控制台的「Cloud Messaging」功能,输入你打印的FCM Token发送测试通知,快速验证推送链路
  • 如果测试失败,优先查看Xcode控制台的日志,搜索FCM、APNS关键词,常见问题包括Token获取失败、证书不匹配、权限未授予等
  • 注意:开发环境要用开发证书,生产环境要用生产证书,两者不能交叉使用

内容的提问来源于stack exchange,提问作者K. Mitra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:24:28