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

Flutter:应用终止状态下定时通知触发方案咨询

无远程依赖实现Flutter应用终止时的定时通知

要实现应用终止后仍能触发定时通知,无需依赖远程服务,需针对Android和iOS分别采用系统级方案或适配现有库的配置,以下是具体方案:

Android 平台方案

系统级实现(基于AlarmManager)

  • 申请精确调度权限:
    在AndroidManifest.xml中添加权限声明:
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" /> <!-- API 31+ 新增 -->
    
    运行时动态请求权限(需依赖permission_handler库):
    import 'package:permission_handler/permission_handler.dart';
    
    Future<void> requestExactAlarmPermission() async {
      final status = await Permission.scheduleExactAlarm.request();
      if (!status.isGranted) {
        openAppSettings();
      }
    }
    
  • 你现有代码中已设置androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle,这是正确的,但必须确保权限已授予——高版本Android会拒绝无权限的精确调度请求,导致应用终止后通知失效。
  • 若flutter_local_notifications调度不稳定,可直接使用android_alarm_manager_plus库:该库封装Android原生AlarmManager,能在应用终止时唤醒广播接收器,触发后调用通知服务发送提醒。

额外优化

部分厂商(如小米、华为)的电池优化会强制杀死后台进程,需引导用户将应用加入白名单:

Future<void> requestIgnoreBatteryOptimizations() async {
  final status = await Permission.ignoreBatteryOptimizations.request();
  if (!status.isGranted) {
    openAppSettings();
  }
}

iOS 平台方案

iOS原生本地通知系统(UNUserNotificationCenter)本身支持应用终止时触发通知,问题通常出在配置或权限缺失:

  • 完善权限请求:初始化通知时明确请求所需权限:
    final iOSSettings = DarwinInitializationSettings(
      requestAlertPermission: true,
      requestBadgePermission: true,
      requestSoundPermission: true,
    );
    
  • Info.plist配置:添加后台模式支持(确保重复/定时通知稳定触发):
    <key>UIBackgroundModes</key>
    <array>
      <string>remote-notification</string>
      <string>fetch</string>
    </array>
    
  • 你代码中使用matchDateTimeComponents: DateTimeComponents.time实现每日重复,这对应iOS的UNCalendarNotificationTrigger,只要权限正确,应用终止后仍会正常触发。

现有代码调整建议

  1. 在initNotifications中补充权限请求逻辑:
    Future<void> initNotifications() async {
      // Android 权限前置请求
      await requestExactAlarmPermission();
      await requestIgnoreBatteryOptimizations();
    
      final InitializationSettings initializationSettings = InitializationSettings(
        android: AndroidInitializationSettings('@mipmap/ic_launcher'),
        iOS: DarwinInitializationSettings(
          requestAlertPermission: true,
          requestBadgePermission: true,
          requestSoundPermission: true,
        ),
      );
    
      await _flutterLocalNotificationsPlugin.initialize(
        initializationSettings,
        onDidReceiveNotificationResponse: _onDidReceiveNotificationResponse,
        onDidReceiveBackgroundNotificationResponse: _onDidReceiveBackgroundNotificationResponse,
      );
    }
    
  2. 确保Reminder的ID唯一,避免新通知覆盖旧的定时任务。

内容的提问来源于stack exchange,提问作者DonMarc0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:45:19