应用处于终止状态时收到通知如何运行Dart代码并提交数据到Firebase?
实现方案
核心思路
不需要使用长期后台运行的第三方服务包,直接使用Firebase Cloud Messaging(FCM)自带的后台消息回调能力即可实现需求:应用被杀死/后台运行时收到推送会被系统临时唤醒执行回调逻辑,完成提交操作后系统会自动回收临时进程,不会长期占用后台资源。
具体实现步骤
- 基础依赖配置:项目中集成
firebase_core和firebase_messaging包,完成Firebase项目和客户端的基础绑定配置。 - 定义顶层后台消息回调函数:该函数必须是顶层或静态函数,添加
@pragma('vm:entry-point')注解避免被Dart编译时摇树优化移除:
@pragma('vm:entry-point') Future<void> fcmBackgroundMessageHandler(RemoteMessage message) async { // 回调执行时先初始化Firebase await Firebase.initializeApp(); // 写入你需要提交到Firebase的业务逻辑,例如写入Firestore/云函数上报等 await FirebaseFirestore.instance.collection("report_data").add({ "notification_id": message.messageId, "received_at": DateTime.now().toUtc(), // 补充其他需要上报的字段 }); // 逻辑执行完成无需手动销毁,系统会自动回收该临时执行进程 }
- 注册回调:在应用入口main函数中提前注册该后台回调:
void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // 注册FCM后台消息回调 FirebaseMessaging.onBackgroundMessage(fcmBackgroundMessageHandler); runApp(const MyApp()); }
- 平台适配配置
- Android端:在
AndroidManifest.xml中配置FCM所需的通知通道,如需在国内厂商系统上稳定触发,需要引导用户开启应用的自启动、后台活动权限。 - iOS端:在Xcode项目的Signing & Capabilities中开启Background Modes,勾选
Remote notifications选项,同时完成APNs证书和FCM的关联配置。
- Android端:在
注意事项
- 后台回调的最长执行时间被系统限制为30秒,提交逻辑要尽量轻量化,避免超时被系统强制终止。
- 该方案仅在收到FCM通知时临时唤醒应用执行逻辑,不会长期驻留后台,符合你不希望应用长期后台运行的要求。
内容的提问来源于stack exchange,提问作者saeid teroda
相关产品推荐
相关产品推荐

