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

Flutter集成Firebase推送时iOS真机收不到通知但安卓设备接收正常

问题根因定位及解决方案

核心问题1:禁用Firebase方法调配后未手动适配APNs回调

你在Info.plist中将FirebaseAppDelegateProxyEnabled设为false,等于关闭了Firebase自动接管APNs token、通知回调的能力,但是你没有在AppDelegate中手动实现对应的转发逻辑,导致Firebase无法拿到iOS设备的APNs token,自然无法下发推送。

修复后的AppDelegate代码:

import UIKit
import Flutter
import Firebase

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

  // 手动转发APNs token到Firebase
  override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Messaging.messaging().apnsToken = deviceToken
    super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
  }

  // 手动处理前台收到的远程通知
  override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    Messaging.messaging().appDidReceiveMessage(userInfo)
    completionHandler(UIBackgroundFetchResult.newData)
  }
}

核心问题2:通知权限请求未等待异步结果

你当前Dart代码中的requestPermission是异步方法,没有加await,可能出现权限还未完成授权,就执行后续订阅主题、注册FCM的逻辑,导致注册失败。

修复后的推送服务代码:

import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart';

class PushNotificationService {
  final FirebaseMessaging _fcm;

  PushNotificationService(this._fcm);

  Future initialise() async {
    if (Platform.isIOS) {
      // 加await等待权限申请结果
      NotificationSettings settings = await _fcm.requestPermission(
        alert: true,
        announcement: false,
        badge: true,
        carPlay: false,
        criticalAlert: false,
        provisional: false,
        sound: true,
      );
      // 可加判断:如果用户未授权直接终止后续逻辑
      if (settings.authorizationStatus != AuthorizationStatus.authorized) {
        print("用户未授予通知权限");
        return;
      }
      // 调试阶段建议打印FCM token,确认能正常获取
      String? token = await _fcm.getToken();
      print("iOS FCM Token: $token");
    }

    await _fcm.subscribeToTopic("mytargettopic");
  }
}

需额外验证的配置点

  • 确认GoogleService-Info.plist是通过Xcode的「Add Files to "Runner"」选项添加到项目,勾选了Runner target的复制权限,不是直接拖到文件夹中。
  • 确认Firebase控制台上传的APNs证书和你当前App的Bundle ID、打包环境(开发/生产)完全匹配,测试阶段优先使用开发证书调试。
  • 必须使用iOS真机测试,模拟器不支持接收APNs推送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:06:05