-
반응형
오늘은 플러터로 앱을 개발하면서 가장 머리 아팠던
백그라운드 위치추적 기능에 대해 이야기 해볼까 합니다.
애초에 백그라운드 위치추적 기능을 제공하는 플러터 패키지가 별로 없어요.
그래서 저도 이거저거 다 시도해 보았지만, 결국 제대로 작동을 했던 건
flutter_background_geolocation 이었습니다!
현재, 안드로이드는 라이선스 문제로 인해 유료로 사용을 해야하고,
IOS 는 무료로 사용할 수 있어요.
(패키지 설명에는 안드로이드도 디버그 모드로는 테스트 가능하다고 하는데,
저는 디버그 모드로 실행하면, 위치추적 기능이 실행되는 순간 앱이 강제 종료되더라구요)
자 그럼, 지금부터 패키지 설치 방법부터 코드 작성 방법까지 하나하나 같이 살펴 볼게요!
1. 패키지 설치하기
- pubspec.yaml 에 직접 패키지를 추가
(터미널에 flutter pub add flutter_background_geolocation 명령어 입력해서 설치해도 됩니다)
2. 사전 설정하기
① IOS
- 우선 Xcode 를 열어 Signing & Capabilities → Release 경로에서(아래화면)
Loacation updates, Background fetch, Background processing 항목을 체크합니다.
- Info.plist 경로에 들어가서 아래 이미지에 있는 4가지 항목을 추가합니다.
여기까지 하시면 IOS 사전 설정은 끝!!!
② 안드로이드
- android → app → src → main → AndroidManifest.xml 경로에서 아래 이미지에 표시된 코드 추가
이거 복사해서 붙여 넣으세요 ▶ xmlns:tools="http://schemas.android.com/tools"
이거 복사해서 붙여 넣으세요 ▶ tools:replace="android:label"
- android → build.gradle 경로에서 아래 이미지에 표시된 코드 추가
아래 코드 복사에서 입력하세요
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
ext {
compileSdkVersion = 33 // 더 상위 버전이 있다면 그 버전으로 입력하셔도 됩니다.
targetSdkVersion = 33 // 더 상위 버전이 있다면 그 버전으로 입력하셔도 됩니다.
appCompatVersion = "1.4.2" // 더 상위 버전이 있다면 그 버전으로 입력하셔도 됩니다.
playServicesLocationVersion = "20.0.0" // 더 상위 버전이 있다면 그 버전으로 입력하셔도 됩니다.
}아래 코드 복사에서 입력하세요
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
maven { url "${project(':flutter_background_geolocation').projectDir}/libs" }
maven { url 'https://developer.huawei.com/repo/' }
maven { url "${project(':background_fetch').projectDir}/libs" }- android → app → build.gradle 경로에서 아래 이미지에 표시된 코드 추가
이거 복사해서 붙여 넣으세요 ▶ compileSdkVersion rootProject.ext.compileSdkVersion
이거 복사해서 붙여 넣으세요 ▶ targetSdkVersion rootProject.ext.targetSdkVersion
※ 이 부분은 라이선스 구매 후에 입력해야 합니다.
라이선스 구매 후 라이선스키를 발급받은 후,
android → app → src → main → AndroidManifest.xml 경로에서 아래 이미지에 표시된 코드를 추가합니다.
아래 코드 복사에서 입력하세요
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
<meta-data
android:name="com.transistorsoft.locationmanager.license"
android:value="발급 받은 라이스선스키를 여기에 입력하세요" />여기까지 안드로이드 사전 설정 끝!!!
다시한번 말씀드리지만, 제가 테스트해 본 결과, 안드로이드 디버그 모드로 실행하면, 앱 실행 시 라이선스 인증 실패 메시지가 떴고
위치추적이 시작되는 순간 앱이 강제 종료되었어요😩
3. 실제 코드에서 패키지 사용하기
- 저는 startBackgroundLocationServie 라는 메소드를 만들어서 사용했어요!
앱이 켜질 때 바로 위치추적을 시작하는 것이 아니라, 특정 버튼을 눌렀을 때 위치추적이 시작되고
버튼을 다시 누르면 위치추적이 꺼지는 기능이 필요한 앱이라서요ㅎㅎ
- 참고로, 이 패키지는 공통 설정 사항도 있지만, IOS 와 안드로이드 각각 설정을 해줘야하는 값들이 있더라구요.
아래의 설정들은 일단 IOS 와 안드로이드 설정 모두 적용한 거라서 그냥 저렇게 쓰셔도 되는데,
본인 앱 성격에 맞는 위치추적 설정을 하시려면, 패키지 설명 다트파일 들어가셔서 하나하나 보시고 맞게 설정하시면 됩니다!
(저는 배터리 효율성이 아니라 정확한 데이터 수집을 목적으로 설정한거라, 굳이 초실시간으로 위치 정보를 수집하고
업데이트해야하는 앱이 아니라면, 그에 맞게 설정 바꾸시면 될 것 같아요~!)
다만, 뭐 하나 잘못 설정하면 백그라운드 위치추적이 잘 안되니까 조심하세요! 저도 엄청 골치아팠어요...
import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' as bg; Future<void> startBackgroundLocationService() async { await bg.BackgroundGeolocation.ready(bg.Config( desiredAccuracy: bg.Config.DESIRED_ACCURACY_HIGH, preventSuspend: true, heartbeatInterval: 5, stopOnStationary: false, distanceFilter: 0, isMoving: true, disableElasticity: true, stopOnTerminate: true, startOnBoot: false, stationaryRadius: 25, logLevel: bg.Config.LOG_LEVEL_VERBOSE, locationUpdateInterval: 5000, disableLocationAuthorizationAlert: true, showsBackgroundLocationIndicator: true )); await bg.BackgroundGeolocation.start(); bg.BackgroundGeolocation.onLocation((bg.Location location) async { try { double latitude = location.coords.latitude; double longitude = location.coords.longitude; Position position = Position( latitude: latitude, longitude: longitude, accuracy: location.coords.accuracy, altitude: location.coords.altitude, heading: location.coords.heading, speed: location.coords.speed, speedAccuracy: location.coords.speedAccuracy, timestamp: DateTime.parse(location.timestamp), ); //이 부분에 백그라운드 위치추적이 시작되었을 때 실행하고자 하는 코드를 넣어주시면 됩니다! } catch (e, stackTrace) { print('백그라운드 위치 업데이트 오류: $e'); print('Stack trace: $stackTrace'); } }); }
어쩌면 들어와서
지금 당신의 그 고민이
해결되었을지도
from.
우리동네미인
반응형'Flutter' 카테고리의 다른 글
[Flutter] 플러터 코딩, 순위 계산하기(나는 몇등일까? 순위 계산법!) (0) 2023.07.06 [Flutter] 대표적인 예외처리 방법! (try-catch) (0) 2023.07.06