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

Flutter应用杀死状态下iOS/Android推送通知点击事件失效求助

问题排查与解决方案

一、代码执行时机问题

getInitialMessage()必须在Firebase初始化完成后调用,且要放在应用启动的最早期——比如main()函数里、runApp()之前,或者首页initState的最开头。如果你的代码是在某个非启动页面的initState里,应用从杀死状态启动时可能还没走到这个页面,直接导致函数没执行。

调整后的代码示例:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  
  // 在这里调用getInitialMessage,保证启动时就执行
  final RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage();
  if (initialMessage != null) {
    print("getInitialMessage触发: $initialMessage");
    // 这里写你的通知点击跳转逻辑
  }

  runApp(MyApp());
}

二、Android平台配置检查

  1. 确认AndroidManifest.xml里的推送服务配置正确,尤其是FirebaseMessagingService的声明:
    <service
        android:name=".MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    
  2. 推送消息的payload必须包含click_action字段,且值要和主Activity的intent-filter匹配:
    推送payload示例:
    {
      "notification": {
        "title": "测试通知",
        "body": "点击跳转"
      },
      "data": {
        "click_action": "FLUTTER_NOTIFICATION_CLICK",
        "screen": "detail"
      }
    }
    
    主Activity添加对应intent-filter:
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="FLUTTER_NOTIFICATION_CLICK" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    

三、iOS平台配置检查

  1. 确保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()
        if #available(iOS 10.0, *) {
          UNUserNotificationCenter.current().delegate = self
        }
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
      }
    
      // 处理杀死状态下的通知点击回调
      override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        completionHandler(UIBackgroundFetchResult.newData)
      }
    }
    
  2. 推送的APNs payload要包含content-available: 1,确保应用能被唤醒处理点击:
    {
      "aps": {
        "alert": {
          "title": "测试通知",
          "body": "点击跳转"
        },
        "content-available": 1
      },
      "data": {
        "screen": "detail"
      }
    }
    

四、版本与测试细节

  • 检查firebase_messaging版本,执行flutter pub upgrade firebase_messaging更新到最新稳定版,避免版本bug。
  • 测试方式要正确:Android别用IDE停止按钮杀应用,要在系统应用列表划掉;iOS可以用Xcode停止或后台划掉,再用Firebase控制台/APNs工具发推送。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:44