[Flutter] flutter_ background_service 사용기 (2024/1/28)

Seung Pyo Lee·2024년 1월 29일
0

2024

목록 보기
1/1
post-thumbnail

flutter로 토이 프로젝트 도중, 백그라운드 서비스를 이용해야 하는 경우가 발생하여, flutter_background_service를 이용하게 되었다.
그와 관련된부분을 정리하였다.

공식 문서 : https://pub.dev/packages/flutter_background_service

1. 설정

설치 관련은 공식문서의 installing 부분을 참고하였다.

  • 터미널
 $ flutter pub add flutter_background_service

또는

  • flutter 프로텍트의 pubspec.yaml
...
dependencies:
  flutter_background_service: ^5.0.5
...

2. 사용

  1. 사용하는 dart 파일에서 다음을 import 해주어야한다.
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_background_service_android/flutter_background_service_android.dart';
  1. 필자는 별개의 dart 파일을 만들어 제작하였다. 백그라운드 서비스는 어플리케이션이 시작될 때 백그라운드서비스를 initialize하게 되어있다.
Future<void> initalizeService() async {
  final service = FlutterBackgroundService();
  await service.configure(
    iosConfiguration: IosConfiguration(
      autoStart: true,
      onForeground: onStart,
      onBackground: onIosBackground,//ios의 경우 백그라운드시의 function 이 별개로 되어있다.
    ),
    androidConfiguration: AndroidConfiguration(
      onStart: onStart,
      isForegroundMode: true,//false 시 백그라운드모드
      autoStart: frue,//초기화 시 자동 시작
    ),
  );
}
  1. 백그라운드 서비스 가 시작 될 시 실행하게 될 코드
@pragma('vm:entry-point')
Future<bool> onIosBackground(ServiceInstance service) async {
  WidgetsFlutterBinding.ensureInitialized();
  DartPluginRegistrant.ensureInitialized();
  return true;
}

@pragma('vm:entry-point')
onStart(ServiceInstance service) async {
  DartPluginRegistrant.ensureInitialized();
  if (service is AndroidServiceInstance) { // 서비스의 백그라운드/포그라운드가 변경되었을경우
    service.on('setAsForeground').listen((event) {
      service.setAsBackgroundService();
    });
    service.on('setAsBackground').listen((event) { // 서비스의 백그라운드/포그라운드가 변경되었을경우
      service.setAsBackgroundService();
    });
  }
  service.on('stopService').listen((event) {
    service.stopSelf();
  });
  Timer.periodic(const Duration(seconds: 1), (timer) async {//매 초 백그라운드 서비스를 실행한다.
    if (service is AndroidServiceInstance) {
      if (await service.isForegroundService()) { // foregroundservice의 경우
      	flutterLocalNotificationsPlugin.show(
          notificationId,
          'Service',
          'Awesome ${DateTime.now()}',
          const NotificationDetails(
            android: AndroidNotificationDetails(
              notificationChannelId,
              'MY FOREGROUND SERVICE',
              icon: 'ic_bg_service_small',
              ongoing: true,
            ),
          ),
        );
      }
      // 이 이후의 경우는 사용자가 인지하지 못하는 백그라운드 function들이 실행된다.
      print("Background");
      service.invoke('update');
    }
  });
  1. 각 화면에서 버튼, inital()등에서 호출, 종료가 가능하다.
FlutterBackgroundService().startService();//서비스 시작
FlutterBackgroundService().invoke('setAsForeground');// 서비스를 foreground로 변경
FlutterBackgroundService().invoke('setAsBackground');// 서비스를 background로 변경
FlutterBackgroundService().invoke('stopService'); // 서비스 정지
  1. 현재 어플리케이션에서는 main()에서 초기화를 진행하고 있다.
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initalizeService();
  runApp(const App());
}
  1. 추가로 알아야 할 것
  • 백그라운드 서비스는 안드로이드와 IOS에서만 지원된다. 웹에서는 작동하지 않고, 디버깅 시 에러가 발생하게 된다.
  • 백그라운드 서비스의 경우 위젯 트리에서 실행되는것이 아니라 별개의 function으로 실행된다. 그렇기 때문에, 백그라운드서비스 부분에서 변경이 발생 될 경우, Hot reload 기능이 작동하지 않는다. 때문에, 변경이 있는 경우 다시 디버깅을 해야하는 불편함이 존재한다.
  • if (await service.isForegroundService()) {} 부분을 실행하지 않고서 그 뒤부분으로 백그라운드 only 서비스를 운용하는것도 가능하다
  • 백그라운드 서비스의 경우 앱이 종료되지 않는 한, 서비스가 시작되면 화면이 꺼진 상태에서도 계속 실행하게 된다. 그렇기 때문에 신중하게 사용해야한다.

참고 url

Flutter Background Services and Foreground Service Tutorial part 1

flutter_background_service 5.0.5

profile
Seung Pyo Lee / Computer Science in UCR

1개의 댓글

comment-user-thumbnail
2024년 4월 19일

혹시 Ios release 모드에서도 작동하나요?

답글 달기

관련 채용 정보