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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:03:17