Flutter如何用workmanager实现Android和iOS系统的后台通知功能

我想在Flutter应用中实现Android和iOS系统的后台通知功能,听说workmanager插件可以做到,但不太清楚具体如何操作。能否详细说明如何配置和使用workmanager来实现这个功能?特别是在不同平台上的具体实现步骤和注意事项有哪些?比如Android的后台任务限制和iOS的Background Fetch机制应该如何适配?

2 回复

使用Workmanager实现Flutter后台通知:

  1. 添加依赖:workmanager: ^0.4.1
  2. 配置Android权限和iOS后台模式
  3. 初始化Workmanager,注册任务回调
  4. 使用registerPeriodicTask设置定期任务
  5. 在回调中使用flutter_local_notifications发送通知

注意:iOS后台限制较多,需配置后台刷新权限。

更多关于Flutter如何用workmanager实现Android和iOS系统的后台通知功能的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用workmanager插件可以实现Android和iOS的后台任务执行,但需要注意:

1. 平台差异

  • Android:支持真正的后台任务(需配置前台服务)
  • iOS:仅限于特定场景(静默推送、后台获取等),功能受限

2. 实现步骤

添加依赖

dependencies:
  workmanager: ^0.5.1
  flutter_local_notifications: ^16.3.0

Android配置

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

iOS配置

// AppDelegate.swift 添加:
import workmanager

@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    WorkmanagerPlugin.registerBGProcessingTask(withIdentifier: "dev.flutter.background.refresh")
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

核心代码

import 'package:workmanager/workmanager.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) async {
    final FlutterLocalNotificationsPlugin notifications = FlutterLocalNotificationsPlugin();
    
    // 初始化通知
    const AndroidInitializationSettings androidSettings = AndroidInitializationSettings('@mipmap/ic_launcher');
    const DarwinInitializationSettings iosSettings = DarwinInitializationSettings();
    const InitializationSettings settings = InitializationSettings(
      android: androidSettings, 
      iOS: iosSettings
    );
    await notifications.initialize(settings);
    
    // 显示通知
    await notifications.show(
      0,
      '后台任务',
      '任务执行时间: ${DateTime.now()}',
      const NotificationDetails(
        android: AndroidNotificationDetails(
          'channel_id',
          '后台通知',
          importance: Importance.high,
        ),
        iOS: DarwinNotificationDetails(),
      ),
    );
    
    return Future.value(true);
  });
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Workmanager().initialize(callbackDispatcher);
  runApp(MyApp());
}

// 注册周期性任务
void registerBackgroundTask() {
  Workmanager().registerPeriodicTask(
    "backgroundNotification",
    "backgroundNotificationTask",
    frequency: const Duration(hours: 1),
    constraints: Constraints(
      networkType: NetworkType.connected,
    ),
  );
}

3. 重要说明

  • iOS需要开启后台模式能力(Xcode中设置Background Modes)
  • Android 10+需要前台服务权限
  • iOS实际执行时间由系统决定,无法保证准时
  • 测试时建议使用registerOneOffTask进行快速验证

这种方式可以在两个平台实现基本的后台通知功能,但iOS的限制较多,实际效果可能不如Android稳定。

回到顶部