在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稳定。