[flutter] 플러터 geolocator와 GPS를 이용한 위치 기반 푸시 알림 애플리케이션 개발

이번 글에서는 플러터(Flutter)를 사용하여 위치 기반 푸시 알림 애플리케이션을 개발하는 방법에 대해 알아보겠습니다. 이 애플리케이션은 Geolocator 패키지를 사용하여 사용자의 현재 위치를 가져오고, GPS를 통해 위치를 추적하여 일정 범위 안에 들어가면 푸시 알림을 보내는 기능을 포함합니다.

Geolocator 패키지 설치하기

먼저, 플러터 프로젝트에 Geolocator 패키지를 설치해야 합니다. pubspec.yaml 파일에 아래와 같이 의존성을 추가해주세요.

dependencies:
  geolocator: ^7.6.2

의존성을 추가한 후에는 flutter pub get 명령어를 사용하여 패키지를 다운로드하십시오.

위치 권한 설정

Geolocator 패키지를 사용하기 위해서는 위치 권한이 필요합니다. 안드로이드와 iOS에서 위치 권한을 설정하기 위해 아래와 같이 작성해주세요.

안드로이드

AndroidManifest.xml 파일에 위치 권한을 추가해주세요.

<manifest ...
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

iOS

Info.plist 파일에 위치 권한을 추가해주세요.

<key>NSLocationWhenInUseUsageDescription</key>
<string>앱에서 위치 정보에 접근하기 위해 사용합니다.</string>

현재 위치 가져오기

일단 Geolocator 패키지를 사용하여 사용자의 현재 위치를 가져오는 방법을 알아보겠습니다.

import 'package:geolocator/geolocator.dart';

Position? currentPosition;

void getCurrentLocation() async {
  Position position = await Geolocator.getCurrentPosition(
    desiredAccuracy: LocationAccuracy.high,
  );
  
  setState(() {
    currentPosition = position;
  });
}

위의 예제 코드에서 getCurrentPosition 메서드는 현재 위치를 가져오는 메서드입니다. desiredAccuracy 매개변수를 통해 위치의 정확도를 설정할 수 있습니다. Position 객체에서 위치 정보를 가져올 수 있으며, 이를 변수에 저장하여 사용할 수 있습니다.

위치 추적하기

이제 Geolocator 패키지를 이용하여 GPS를 통해 사용자의 위치를 추적해보겠습니다.

import 'package:geolocator/geolocator.dart';

Stream<Position>? positionStream;

void startTrackingLocation() {
  positionStream = Geolocator.getPositionStream(
    desiredAccuracy: LocationAccuracy.high,
    distanceFilter: 10, // 위치가 10미터마다 업데이트되도록 설정
  ).listen((Position position) {
    setState(() {
      currentPosition = position;
    });
  });
}

void stopTrackingLocation() {
  positionStream?.cancel();
}

위의 예제 코드에서 getPositionStream 메서드는 위치를 추적하는 스트림을 반환합니다. desiredAccuracy 매개변수를 통해 위치의 정확도를 설정하고, distanceFilter 매개변수를 통해 위치 업데이트가 발생하는 최소 거리를 설정할 수 있습니다. listen 메서드를 통해 위치가 업데이트될 때마다 콜백 함수를 실행하고, 해당 콜백 함수에서 현재 위치를 저장합니다.

일정 범위 안에 있는지 확인하기

이제 현재 위치를 가져오고, 위치를 추적하는 기능을 가지고 있으므로 일정 범위 안에 있는지를 확인할 수 있습니다.

import 'package:geolocator/geolocator.dart';

bool isWithinRange(Position target, double range) {
  double distanceInMeters = Geolocator.distanceBetween(
    currentPosition.latitude,
    currentPosition.longitude,
    target.latitude,
    target.longitude,
  );

  return distanceInMeters <= range;
}

위의 예제 코드에서 distanceBetween 메서드를 사용하여 현재 위치와 대상 위치 사이의 거리를 계산합니다. 거리를 미터 단위로 반환하므로, 해당 거리를 일정 범위와 비교하여 isWithinRange 메서드가 true 또는 false를 반환하도록 할 수 있습니다.

위의 예제 코드를 활용하여 위치 기반 푸시 알림 애플리케이션을 개발할 수 있습니다. 플러터와 Geolocator 패키지를 이용하여 사용자의 위치를 가져오고 추적하는 기능을 구현하는 방법에 대해 알아보았습니다.

더 자세한 내용은 Geolocator 패키지의 공식 문서를 참조해주세요.