안녕하세요, 기술 블로거 [Maccrey]입니다.
이번에는 플러터에서 WorkManager 패키지를 활용하여 백그라운드에서 GPS 위치를 받아와서 Hive에 저장하는 방법에 대해 알아보겠습니다.
특히 스마트폰이 꺼져도 계속해서 위치를 저장할 수 있는 방법에 대해 초보자도 쉽게 이해할 수 있도록 풀어볼게요.
1. GPS 위치 백그라운드 작업 제한 이해하기
플러터에서 GPS 위치를 백그라운드로 받아오는 작업을 하려고 할 때, 대부분의 Android 기기에서는 백그라운드 작업을 제한합니다.
앱이 백그라운드에서 실행 중일 때, 시스템 자원을 절약하고 배터리 소모를 줄이기 위해 자동으로 앱을 종료시킬 수 있습니다.
그러나 조깅 앱과 같은 경우, 스마트폰이 꺼져도 계속 위치를 추적해야 하므로 이러한 제한을 우회해야 합니다.
그 해결책 중 하나는 포그라운드 서비스를 사용하는 것입니다.
2. 포그라운드 서비스로 작업 유지하기
안드로이드에서는 포그라운드 서비스를 사용하면 앱이 백그라운드에 있어도 종료되지 않도록 할 수 있습니다.
포그라운드 서비스는 시스템에서 중요하다고 판단되는 작업을 수행하는 서비스로, 사용자에게 알림을 표시하여 작업이 진행 중임을 알립니다.
작동 방식
- 앱이 포그라운드 상태로 위치 추적을 시작합니다.
- 시스템에서 앱을 강제로 종료하지 않습니다.
- 포그라운드 서비스는 알림을 통해 사용자에게 위치 추적이 계속 진행 중임을 알릴 수 있습니다.
3. 플러터에서 WorkManager와 포그라운드 서비스 사용하기
플러터에서 WorkManager를 사용하여 백그라운드 작업을 관리할 때, 포그라운드 서비스를 설정하는 방법을 알아보겠습니다.
필요한 패키지
- workmanager: WorkManager 패키지를 사용하여 백그라운드 작업을 예약합니다.
- hive: GPS 위치 데이터를 저장할 Hive 데이터베이스를 사용합니다.
- geolocator: GPS 위치를 가져오기 위한 플러그인입니다.
포그라운드 서비스 설정
- WorkManager 작업을 포그라운드에서 실행하도록 설정합니다.
- WorkManager의 setForeground() 메서드를 사용하여 작업을 포그라운드로 전환하고, 알림을 표시합니다.
import 'package:workmanager/workmanager.dart';
import 'package:geolocator/geolocator.dart';
import 'package:hive/hive.dart';
// 백그라운드 작업을 실행할 함수
void backgroundTask() async {
// 위치 받아오기
Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
// 위치 데이터를 Hive에 저장
var box = await Hive.openBox('locationBox');
box.put('lastPosition', position.toString());
// 알림 표시 (포그라운드 작업으로 전환)
await Workmanager().setForeground(true);
print('GPS 위치가 저장되었습니다.');
}
// 백그라운드 작업 초기화
void initializeWorkManager() {
Workmanager().initialize(
callbackDispatcher,
isInDebugMode: true,
);
}
// WorkManager 콜백 디스패처
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) {
if (task == 'background_location') {
backgroundTask();
return Future.value(true);
}
return Future.value(false);
});
}
이 코드는 GPS 위치를 받아와서 Hive에 저장하고, 작업이 포그라운드에서 실행되도록 설정합니다.
4. 조깅 앱에서 위치 추적을 끊임없이 실행하는 방법
조깅 앱에서는 사용자가 계속 움직이면서 위치를 추적해야 합니다.
이를 위해서는 GPS 위치를 일정 간격으로 주기적으로 받아오는 방법이 필요합니다.
WorkManager는 주기적인 작업을 설정할 수 있어 이를 활용할 수 있습니다.
주기적인 작업 설정 예제
Workmanager().registerPeriodicTask(
'locationTask',
'background_location',
frequency: Duration(minutes: 15), // 15분마다 위치 업데이트
initialDelay: Duration(seconds: 10), // 10초 후 첫 실행
inputData: <String, dynamic>{'key': 'value'},
);
5. 요약
플러터에서 WorkManager를 사용하여 GPS 위치를 백그라운드에서 저장하려면 포그라운드 서비스를 활용해야 합니다.
이를 통해 시스템이 앱을 종료하는 것을 방지하고, 계속해서 위치를 추적할 수 있습니다.
WorkManager와 geolocator, hive 패키지를 활용하여 효율적으로 백그라운드 작업을 설정하고 주기적으로 GPS 위치를 받아올 수 있습니다.
이 방식은 조깅 앱과 같은 사용자가 계속 이동하는 앱에 적합하며, 스마트폰이 꺼져도 앱이 종료되지 않도록 합니다.
이 방법을 사용하면 배터리 소모를 최소화하면서도 안정적으로 위치 정보를 저장할 수 있습니다.
구독!! 공감과 댓글,
광고 클릭은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
Tester Share [테스터쉐어] - Google Play 앱
Tester Share로 Google Play 앱 등록을 단순화하세요.
play.google.com
'Flutter > Study' 카테고리의 다른 글
Flutter 백그라운드 위치 추적 앱 개발하기: WorkManager와 Riverpod로 구현하는 조깅 앱 (0) | 2025.02.12 |
---|---|
플러터에서 조깅 앱을 만들 때 백그라운드에서 GPS 위치를 계속 저장하는 방법 (1) | 2025.02.12 |
플러터 TextFormField에서 블루투스 키보드 입력 제한하기: inputFormatters 사용법 (0) | 2024.12.03 |
플러터에서 MVVM 패턴의 ViewModel이란? MVC 패턴과 비교해서 이해하기 (1) | 2024.11.14 |
플러터에서 위젯 함수와 클래스 차이점: 코드 분리 시 어떤 것을 선택해야 할까? (1) | 2024.11.14 |