Flutter后台服务插件flutter_background_service_ios的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter后台服务插件flutter_background_service_ios的使用

flutter_background_service_ios

flutter_background_service_iosflutter_background_service包的iOS实现。它允许您在Flutter应用程序中创建和管理后台服务,以确保即使应用被关闭或位于后台时,某些任务仍然可以继续执行。

Usage 使用

这个包是一个支持的联合插件(endorsed federated plugin),这意味着你可以像平常一样使用flutter_background_service。当你这样做时,这个包会自动包含在你的应用程序中。为了更好地理解如何使用flutter_background_service_ios,下面提供了一个完整的示例demo。

示例Demo

首先,在您的pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_background_service: ^latest_version # 替换为最新版本号

接下来,配置iOS项目的后台模式。打开ios/Runner.xcworkspace,选择Runner项目,然后选择Signing & Capabilities标签页,点击+ Capability按钮并添加Background Modes。确保选中了以下选项:

  • Audio, AirPlay, and Picture in Picture
  • Background fetch
  • Remote notifications

之后,在AppDelegate.swift或者AppDelegate.m中初始化服务:

AppDelegate.swift

import UIKit
import Flutter
import flutter_background_service

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)

    // Initialize background service
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    }
    
    FlutterBackgroundService.initialize(isEnabled: true)
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

最后,在您的Dart代码中设置服务逻辑:

import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final service = FlutterBackgroundService();
  await service.configure(
    iosConfiguration: IosConfiguration(
      onForeground: startService,
      autoStart: true,
      allowBatteryOptimization: false,
    ),
  );

  runApp(MyApp());
}

void startService() {
  final service = FlutterBackgroundService();
  service.onDataReceived.listen((event) {
    if (event!['action'] == 'start') {
      print('Service started');
    } else if (event['action'] == 'stop') {
      service.stopBackgroundService();
    }
  });

  Timer.periodic(Duration(seconds: 5), (timer) {
    service.sendData({
      "current_date": DateTime.now().toIso8601String(),
    });
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Background Service Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () => startService(), 
                child: Text('Start Service')
              ),
              ElevatedButton(
                onPressed: () => FlutterBackgroundService().sendData({'action': 'stop'}), 
                child: Text('Stop Service')
              ),
            ],
          ),
        ),
      ),
    );
  }
}

此示例展示了如何启动一个后台服务,并每隔五秒发送一次当前时间戳给前台应用。同时提供了两个按钮来控制服务的启动与停止。

请注意,实际开发过程中可能需要根据具体需求调整上述代码。例如,您可能想要监听特定的通知事件、处理更复杂的数据交换等。希望这些信息对您有所帮助!


更多关于Flutter后台服务插件flutter_background_service_ios的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台服务插件flutter_background_service_ios的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_background_service_ios插件来创建后台服务的示例代码。这个插件允许你在iOS设备上运行后台任务。

首先,确保你已经在你的pubspec.yaml文件中添加了flutter_background_service_ios依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_background_service_ios: ^x.y.z  # 请使用最新版本号

替换^x.y.z为最新的版本号,你可以通过访问pub.dev获取最新版本。

接下来,你需要进行一些iOS特定的配置。

  1. 配置Info.plist

ios/Runner/Info.plist文件中,添加以下键和值以允许后台任务:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>processing</string>
</array>
  1. 配置AppDelegate

ios/Runner/AppDelegate.swift中,配置AppDelegate以支持后台任务。

import UIKit
import Flutter
import flutter_background_service_ios

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    BackgroundServicePlugin.setPluginRegistrantCallback { registrant in
      registrant.register(with: self)
    }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
  1. Flutter代码

在你的Flutter项目中,使用以下代码来注册和运行后台服务。

import 'package:flutter/material.dart';
import 'package:flutter_background_service_ios/flutter_background_service_ios.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Background Service iOS Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 注册后台服务
              FlutterBackgroundServiceIOS.registerBackgroundService(
                onTask: _backgroundTask,
                onTerminate: _onTerminate,
              );

              // 开始后台服务
              FlutterBackgroundServiceIOS.startBackgroundService();
            },
            child: Text('Start Background Service'),
          ),
        ),
      ),
    );
  }

  void _backgroundTask() async {
    // 在后台执行的任务
    print('Background task started');
    // 模拟长时间运行的任务
    await Future.delayed(Duration(seconds: 30));
    print('Background task completed');
  }

  void _onTerminate() {
    // 当后台服务被终止时执行的回调
    print('Background service terminated');
  }
}

在这个示例中,当你点击按钮时,会注册并开始后台服务。后台服务将在后台执行_backgroundTask函数,并在任务完成后或在后台服务被终止时调用_onTerminate回调。

请注意,这只是一个基本的示例,实际使用中你可能需要处理更多的逻辑,例如任务调度、错误处理、状态管理等。此外,后台服务的运行时间和频率受到iOS系统策略的限制,因此请确保你的后台任务符合苹果的后台执行指南。

回到顶部