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

Flutter Firebase Messaging iOS端通知无法接收,求可行解决方案及示例代码

Flutter + Firebase Messaging iOS端无法接收通知排查方案及示例代码

前置必查项(90%的问题出在这里)

  • 确认Xcode中Signing & Capabilities已经添加 Push Notifications 和 Background Modes,Background Modes里勾选 Remote notifications 和 Background fetch
  • 确认Apple Developer后台的App ID已经开启Push Notifications服务,并且开发/生产环境的证书都正确配置到Firebase控制台的Cloud Messaging设置中,注意不要把开发和生产的APNs证书搞混
  • 确认iOS设备上已经给App开启了通知权限,第一次启动时的权限请求必须点允许,可在系统设置-通知中对应App里确认开关状态
  • 确认你使用的是真机测试,iOS模拟器完全不支持接收FCM推送通知,所有模拟器下的推送测试都是无效的
  • 确认Info.plist中已经添加FirebaseAppDelegateProxyEnabled字段,值为NO(手动处理APNs token场景),若使用Firebase自动代理则设为YES,配置需要和你的逻辑保持一致
  • 确认打包时的Bundle ID和Firebase控制台中配置的、Apple Developer后台的App ID完全一致,没有大小写或者字符错误

可用示例代码

Flutter 核心逻辑代码

import 'package:firebase_messaging/firebase_messaging.dart';

// App初始化完成后调用,如首页initState方法内
Future<void> requestNotificationPermission() async {
  FirebaseMessaging messaging = FirebaseMessaging.instance;

  NotificationSettings settings = await messaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true,
  );

  if (settings.authorizationStatus == AuthorizationStatus.authorized) {
    print('用户已授权通知权限');
    // 获取FCM Token,可打印后用于Firebase控制台测试推送
    String? token = await messaging.getToken();
    print('iOS设备FCM Token: $token');
  } else if (settings.authorizationStatus == AuthorizationStatus.denied) {
    print('用户拒绝了通知权限');
  }
}

// 前台收到通知的处理逻辑
void setupForegroundMessageHandler() {
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print('前台收到通知,标题:${message.notification?.title},内容:${message.notification?.body}');
    // 如需前台展示通知横幅,可搭配flutter_local_notifications实现
  });
}

// 后台/杀死状态点击通知打开App的处理逻辑
void setupMessageOpenedHandler() {
  FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
    print('通过通知打开App,携带参数:${message.data}');
  });
}

iOS端 AppDelegate.swift 配置示例

import UIKit
import Flutter
import Firebase
import UserNotifications

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    FirebaseApp.configure()
    // 注册远程通知服务
    UNUserNotificationCenter.current().delegate = self
    application.registerForRemoteNotifications()
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  // iOS前台展示通知横幅的必备实现
  override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .badge, .sound])
  }
}

验证测试步骤

  • 运行App并授权通知权限后,复制控制台打印的iOS设备FCM Token
  • 进入Firebase控制台Cloud Messaging模块,选择发送测试通知,填写通知标题、内容,目标选择「设备令牌」,粘贴刚才获取的FCM Token
  • 发送时注意匹配环境:开发阶段测试选择开发环境,TestFlight/App Store生产环境测试选择生产环境,环境不匹配会直接导致通知发送失败
  • 若控制台显示发送成功但设备未收到,可查看Xcode运行日志,排查是否有APNs Token上报失败、权限未获取的相关报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:48:02