Flutter中如何在应用关闭(杀死状态)捕获OneSignal通知数据并存入Hive
Flutter + OneSignal:应用杀死状态下捕获通知数据并保存到Hive
当应用处于完全杀死状态时,Flutter层面的ForegroundWillDisplayListener无法触发,必须通过原生端的通知点击回调获取数据,再传递给Flutter层处理并保存到Hive。以下是具体实现步骤:
1. 配置原生端的通知点击回调
Android端(Kotlin)
在MainActivity.kt中,初始化OneSignal后设置通知点击监听,捕获数据并传递给Flutter:
import com.onesignal.OneSignal import com.onesignal.notifications.INotificationClickListener class MainActivity : FlutterActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) OneSignal.Notifications.addClickListener(object : INotificationClickListener { override fun onClick(event: INotificationClickEvent) { val additionalData = event.notification.additionalData val collapseKey = event.notification.collapseKey val channel = MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, "onesignal_notification_data") channel.invokeMethod("saveNotificationData", mapOf( "additionalData" to additionalData, "collapseKey" to collapseKey )) } }) } }
iOS端(Swift)
在AppDelegate.swift中实现OneSignal的通知点击回调,将数据传递给Flutter:
import OneSignal class AppDelegate: FlutterAppDelegate { override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { OneSignal.initialize("YOUR_APP_ID", withLaunchOptions: launchOptions) OneSignal.Notifications.addClickListener { result in let notification = result.notification let additionalData = notification.additionalData let collapseKey = notification.collapseKey let channel = FlutterMethodChannel(name: "onesignal_notification_data", binaryMessenger: self.window?.rootViewController as! FlutterBinaryMessenger) channel.invokeMethod("saveNotificationData", arguments: [ "additionalData": additionalData ?? [:], "collapseKey": collapseKey ?? "" ]) } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
2. Flutter层接收数据并保存到Hive
首先在main函数中完成Hive初始化:
import 'package:hive/hive.dart'; import 'package:path_provider/path_provider.dart'; import 'package:flutter/material.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final appDocumentDir = await getApplicationDocumentsDirectory(); Hive.init(appDocumentDir.path); await Hive.openBox('notification_box'); runApp(const MyApp()); }
创建MethodChannel接收原生数据并保存到Hive:
import 'package:flutter/services.dart'; import 'package:hive/hive.dart'; class NotificationHandler { static const MethodChannel _channel = MethodChannel('onesignal_notification_data'); static void setupListener() { _channel.setMethodCallHandler((call) async { if (call.method == 'saveNotificationData') { final additionalData = call.arguments['additionalData'] as Map<String, dynamic>?; final collapseKey = call.arguments['collapseKey'] as String?; final box = Hive.box('notification_box'); await box.put('last_notification', { 'additionalData': additionalData, 'collapseKey': collapseKey, 'timestamp': DateTime.now().millisecondsSinceEpoch }); } }); } }
在应用初始化时启动监听:
class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); NotificationHandler.setupListener(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('OneSignal Hive Demo')), body: Center( child: ElevatedButton( onPressed: () { final box = Hive.box('notification_box'); final data = box.get('last_notification'); print('Saved Notification Data: $data'); }, child: const Text('查看保存的通知数据'), ), ), ), ); } }
注意事项
- 确保OneSignal原生SDK与Flutter插件版本兼容,避免回调不触发。
- iOS需在
Info.plist中开启远程通知权限并配置APNs证书;Android需确保通知权限已开启。 - 若需处理静默通知,Android需添加
BOOT_COMPLETED权限,iOS需开启后台模式的远程通知权限。
内容的提问来源于stack exchange,提问作者Deniz Durmaz
相关产品推荐
相关产品推荐

