flutter本地推送 flutter_local_notifications的使用记录

server/2025/2/14 1:09:07/

flutter_local_notifications

效果

安卓配置(AndroidManifest.xml)

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

可参考下面

<manifest xmlns:android="http://schemas.android.com/apk/res/android"><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /><uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /><uses-permission android:name="com.android.alarm.permission.SET_ALARM"/><uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" /><uses-permission android:name="android.permission.POST_NOTIFICATIONS"/><applicationandroid:label="whisp"android:name="${applicationName}"android:icon="@mipmap/launcher_icon"><activityandroid:name=".MainActivity"android:exported="true"android:launchMode="singleTop"android:taskAffinity=""android:theme="@style/LaunchTheme"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"><!-- Specifies an Android theme to apply to this Activity as soon asthe Android process has started. This theme is visible to the userwhile the Flutter UI initializes. After that, this theme continuesto determine the Window background behind the Flutter UI. --><meta-dataandroid:name="io.flutter.embedding.android.NormalTheme"android:resource="@style/NormalTheme"/><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity><!-- Don't delete the meta-data below.This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --><meta-dataandroid:name="flutterEmbedding"android:value="2" /></application><!-- Required to query activities that can process text, see:https://developer.android.com/training/package-visibility andhttps://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --><queries><intent><action android:name="android.intent.action.PROCESS_TEXT"/><data android:mimeType="text/plain"/></intent></queries>
</manifest>

ios配置AppDelegate.swift(参考下面)

import flutter_local_notifications

 FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
        GeneratedPluginRegistrant.register(with: registry)
    }

if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
}

 (参考下面)

import UIKit
import Flutter
import flutter_local_notifications@main
@objc class AppDelegate: FlutterAppDelegate {override func application(_ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {// This is required to make any communication available in the action isolate.FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) inGeneratedPluginRegistrant.register(with: registry)}if #available(iOS 10.0, *) {UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate}GeneratedPluginRegistrant.register(with: self)return super.application(application, didFinishLaunchingWithOptions: launchOptions)}
}

封装类

import 'dart:async';
import 'dart:io';import 'package:flutter_local_notifications/flutter_local_notifications.dart';@pragma('vm:entry-point')
void notificationTapBackground(NotificationResponse notificationResponse) {// ignore: avoid_printprint('notification(${notificationResponse.id}) action tapped: ''${notificationResponse.actionId} with'' payload: ${notificationResponse.payload}');if (notificationResponse.input?.isNotEmpty ?? false) {// ignore: avoid_printprint('notification action tapped with input: ${notificationResponse.input}');}
}class NotificationHelper {static NotificationHelper? _instance;static NotificationHelper getInstance() {_instance ??= NotificationHelper._initial();return _instance!;}factory NotificationHelper() => _instance ??= NotificationHelper._initial();//创建命名构造函数NotificationHelper._initial() {initialize();}// FlutterLocalNotificationsPlugin实例final FlutterLocalNotificationsPlugin _notificationsPlugin = FlutterLocalNotificationsPlugin();final StreamController<NotificationResponse> selectNotificationStream = StreamController<NotificationResponse>.broadcast();// 常量定义static const String _channelId = 'message_notifications';static const String _channelName = 'message notification';static const String _channelDescription = 'Notifications for receiving new messages';static const String _ticker = 'ticker';static const String _darwinNotificationCategoryPlain = 'plainCategory';static const String darwinNotificationCategoryText = 'textCategory';int id = 0;bool _notificationsEnabled = false;// 初始化通知插件Future<void> initialize() async {try {const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/launcher_icon');const DarwinInitializationSettings initializationSettingsIOS =DarwinInitializationSettings(requestSoundPermission: false, requestBadgePermission: false, requestAlertPermission: false);const InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid,iOS: initializationSettingsIOS,);await _notificationsPlugin.initialize(initializationSettings,onDidReceiveNotificationResponse: selectNotificationStream.add,onDidReceiveBackgroundNotificationResponse: notificationTapBackground,);} catch (e) {print('初始化通知插件失败: $e');}}initPermission() {_isAndroidPermissionGranted();_requestPermissions();_configureSelectNotificationSubject();}closeSubject() {selectNotificationStream.close();}Future<void> _isAndroidPermissionGranted() async {if (Platform.isAndroid) {final bool granted =await _notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.areNotificationsEnabled() ??false;_notificationsEnabled = granted;}}Future<void> _requestPermissions() async {if (Platform.isIOS) {await _notificationsPlugin.resolvePlatformSpecificImplementation<IOSFlutterLocalNotificationsPlugin>()?.requestPermissions(alert: true,badge: true,sound: true,);} else if (Platform.isAndroid) {final AndroidFlutterLocalNotificationsPlugin? androidImplementation =_notificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>();final bool? grantedNotificationPermission = await androidImplementation?.requestNotificationsPermission();_notificationsEnabled = grantedNotificationPermission ?? false;}}void _configureSelectNotificationSubject() {selectNotificationStream.stream.listen((NotificationResponse? response) async {// await Navigator.of(context).push(MaterialPageRoute<void>(//   builder: (BuildContext context) =>//       SecondPage(response?.payload, data: response?.data),// ));print("点击消息携带的数据$response");});}// 显示通知Future<void> showNotification({required String title, required String body, String payload = ""}) async {const AndroidNotificationDetails androidNotificationDetails = AndroidNotificationDetails(_channelId,_channelName,channelDescription: _channelDescription,importance: Importance.max,priority: Priority.high,ticker: _ticker,);const DarwinNotificationDetails iosNotificationDetails = DarwinNotificationDetails(categoryIdentifier: _darwinNotificationCategoryPlain);const NotificationDetails notificationDetails = NotificationDetails(android: androidNotificationDetails, iOS: iosNotificationDetails);await _notificationsPlugin.show(id++,title,body,notificationDetails,payload: payload,);}/// 取消全部通知cancelAll() {_notificationsPlugin.cancelAll();}/// 取消对应ID的通知cancelId(int id) {_notificationsPlugin.cancel(id);}
}

使用

main方法中初始化

NotificationHelper.getInstance().initialize();

首页中进行权限和方法回调绑定和卸载

首页的instate
NotificationHelper.getInstance().initPermission();

首页的dispose

NotificationHelper.getInstance().closeSubject();

调用提示 接收消息直接调用

NotificationHelper.getInstance().showNotification(title: "科学研究", body: "研究开始了", payload: "payload");

这里可以监控点击推送后动作,如跳转页面  response?.data 是携带的数据

 void _configureSelectNotificationSubject() {selectNotificationStream.stream.listen((NotificationResponse? response) async {// await Navigator.of(context).push(MaterialPageRoute<void>(//   builder: (BuildContext context) =>//       SecondPage(response?.payload, data: response?.data),// ));print("点击消息携带的数据$response");});}


http://www.ppmy.cn/server/167481.html

相关文章

PHP 中的除以零错误

除以零错误&#xff08;Division by zero&#xff09;是指数字除以零的情况&#xff0c; 这在数学上是未定义的。在 PHP 中&#xff0c;处理这种错误的方式取决于 PHP 版本&#xff1a; PHP 7&#xff1a; 使用 / 运算符会产生一个警告 (E_WARNING) 并返回 false。 使用 intd…

centos安装Nexus Repository OSS(Maven私服)

1. 下载链接&#xff1a;https://help.sonatype.com/en/download.html 2. 注意页面下载页面中的要求&#xff1a;JDK17&#xff08;启动时提示最低JDK1.8最高JDK17&#xff0c;但是使用JDK1.8无法正常启动&#xff09; 3. mkdir /opt/nexus 将压缩包上传到该目录并解压。 tar …

堆、方法区、虚拟机栈、本地方法栈 和 程序计数器

在 Java 中&#xff0c;内存区域是 JVM&#xff08;Java 虚拟机&#xff09;管理的关键部分&#xff0c;主要包括 堆、方法区、虚拟机栈、本地方法栈 和 程序计数器。这些内存区域各自有不同的职责&#xff0c;共同支持 Java 程序的运行。以下是它们的详细解释&#xff1a; 1. …

汇编知识点汇总

汇编的组成 汇编指令 数据处理指令 数据搬移指令数据位移指令位运算指令算术运算指令比较指令 跳转指令内存读写指令状态寄存器传送指令异常产生指令协处理器指令 伪操作 在程序编译过程中起到编译引导作用的内容 .text .global .if .else .endif 伪指令 不是汇编指令&…

如何将网站提交百度收录完整SEO教程

百度收录是中文网站获取流量的重要渠道。本文以我的网站&#xff0c;www.mnxz.fun&#xff08;当然现在没啥流量&#xff09; 为例&#xff0c;详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…

HarmonyOS第一课第四章习题答案

应用程序框架基础 判断题 1.在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。 答案&#xff1a;对 2.一个应用只可以包含一个UIAbility组件。 答案&#xff1a;错误 3.Background状态在UIAbility实例销毁时触发。可以…

分享一款免费的AI大模型字幕工具,支持语音识别、字幕断句、优化、翻译、视频合成等全流程自动处理(支持抖音、B站、油管等国内外多平台视频下载与处理)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 AI字幕工具:全平台视频创作的福音 📒💡 功能与特点:一网打尽⚙️ 使用⚓️ 相关链接 ⚓️📖 介绍 📖 还在为视频加字幕抓狂?🤯 平台限制多,操作又繁琐?别再挠破头皮啦!今天给大家分享的这款AI神器,简直是视频创…