Flutter教程实现推送通知定时发送

在Flutter中实现推送通知的定时发送功能时,遇到了一些问题:

  1. 使用firebase_messagingflutter_local_notifications插件时,如何精确设定通知的发送时间?比如每天固定时间或特定日期触发。
  2. 应用处于后台或完全关闭时,定时通知能否正常触发?是否需要依赖原生平台的AlarmManager或Background Fetch?
  3. 如果用户在不同时区,如何确保通知时间按本地时间生效?是否需要额外处理时区转换?
  4. 测试时发现通知偶尔延迟或不触发,可能是哪些常见原因导致的?比如Doze模式或系统省电策略的影响。
    希望有经验的大佬分享具体代码示例或优化方案!

更多关于Flutter教程实现推送通知定时发送的实战教程也可以访问 https://www.itying.com/category-92-b0.html

3 回复

要在Flutter中实现推送通知的定时发送,你需要使用Firebase Cloud Messaging(FCM)和后台任务插件。以下是步骤:

  1. 设置Firebase

    • 在Firebase控制台创建项目,添加Flutter应用,并下载google-services.json
    • 配置Android的build.gradle文件以包含Firebase依赖。
  2. 集成FCM

    • 添加firebase_messaging插件到pubspec.yaml
    • 初始化并请求用户授权接收通知:
      FirebaseMessaging messaging = FirebaseMessaging.instance;
      NotificationSettings settings = await messaging.requestPermission();
      
  3. 定时任务: 使用workmanager插件来处理后台任务。首先在pubspec.yaml中添加它:

    workmanager: ^0.4.0
    

    然后配置后台任务:

    void callbackDispatcher() {
      Workmanager.executeTask((taskName, inputData) async {
        // 发送通知逻辑
        return true;
      });
    }
    
  4. 注册定时任务

    Workmanager.registerPeriodicTask("id1", "simpleTask");
    
  5. 构建通知: 当任务触发时,调用FCM API发送通知。你可以在服务器端或通过Firebase Console手动测试。

注意:安卓10+对后台任务有限制,需确保你的任务符合系统要求。

更多关于Flutter教程实现推送通知定时发送的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


要实现Flutter应用的定时推送通知,可以借助Firebase Cloud Messaging (FCM)。首先,在Firebase控制台创建项目并添加Flutter应用,下载google-services.jsonGoogleService-Info.plist配置文件到项目中。

  1. 添加依赖:firebase_messaging: ^latest_version
  2. 初始化:在main()中调用FirebaseMessaging.instance.setForegroundNotificationPresentationOptions()设置通知权限。
  3. 定时任务:使用flutter_local_notifications库配合timer_builder,在指定时间通过FCM发送通知。
  4. 后端逻辑:利用云函数(如Firebase Functions)实现定时任务,调用FCM API发送通知。
  5. 测试:在模拟器或真机上运行应用,验证定时通知功能是否正常工作。

注意处理Android 13及以上版本的通知权限请求。

在Flutter中实现定时推送通知,可以使用flutter_local_notifications插件配合timezoneandroid_alarm_manager_plus(Android)或flutter_local_notifications的定时功能(iOS)。以下是实现步骤:

  1. 添加依赖(pubspec.yaml)
dependencies:
  flutter_local_notifications: ^15.1.1
  timezone: ^0.9.1
  android_alarm_manager_plus: ^2.1.0
  1. 基本实现代码
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:timezone/timezone.dart' as tz;
import 'package:timezone/data/latest.dart' as tz;

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

Future<void> initNotifications() async {
  tz.initializeTimeZones();
  
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('app_icon');
  
  final InitializationSettings initializationSettings =
      InitializationSettings(android: initializationSettingsAndroid);
  
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);
}

Future<void> scheduleDailyNotification() async {
  await flutterLocalNotificationsPlugin.zonedSchedule(
    0,
    '定时通知标题',
    '这是定时通知的内容',
    _nextInstanceOfTime(8, 30), // 每天早上8:30
    const NotificationDetails(
      android: AndroidNotificationDetails(
        'daily_notification_channel',
        '每日通知',
        importance: Importance.max,
        priority: Priority.high,
      ),
    ),
    androidAllowWhileIdle: true,
    uiLocalNotificationDateInterpretation:
        UILocalNotificationDateInterpretation.absoluteTime,
    matchDateTimeComponents: DateTimeComponents.time,
  );
}

tz.TZDateTime _nextInstanceOfTime(int hour, int minutes) {
  final tz.TZDateTime now = tz.TZDateTime.now(tz.local);
  tz.TZDateTime scheduledDate = tz.TZDateTime(
    tz.local,
    now.year,
    now.month,
    now.day,
    hour,
    minutes,
  );
  
  if (scheduledDate.isBefore(now)) {
    scheduledDate = scheduledDate.add(const Duration(days: 1));
  }
  
  return scheduledDate;
}
  1. 使用方式
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initNotifications();
  await scheduleDailyNotification();
  runApp(MyApp());
}

注意事项:

  • Android需要配置后台服务权限
  • iOS需要请求通知权限
  • 定时通知在App被杀死后可能失效,可以考虑使用Firebase Cloud Messaging(FCM)进行服务器端定时推送
回到顶部