본문 바로가기

소셜독

산책 기록 기능 Geolocation + Foreground Tasks

이 글은 소셜독의 기능 중 하나인 산책기록 기능을 구현하면서 겪은 문제들을 기록하기 위해서 작성되었다.

 

https://github.com/mauron85/react-native-background-geolocation

 

GitHub - mauron85/react-native-background-geolocation: Background and foreground geolocation plugin for React Native. Tracks use

Background and foreground geolocation plugin for React Native. Tracks user when app is running in background. - GitHub - mauron85/react-native-background-geolocation: Background and foreground geol...

github.com

이 기능을 구현하는데 최종적으로 사용한 라이브러리이다. 이 라이브러리를 적용 했을때, Android와 Ios기기에서 위치정보를 백그라운드, 포그라운트 상태에서 안정적으로 기록할 수 있었다.

대부분의 상황에 적용이 가능한 좋은 라이브러리로 보인다.

급한 사람은 위 라이브러리를 사용하면 될것같고, 내가 문제를 해결한 과정이 궁금하다면 게시글을 더 읽어보면 될것같다. 

 

https://github.com/Agontuk/react-native-geolocation-service

 

GitHub - Agontuk/react-native-geolocation-service: React native geolocation service for iOS and android

React native geolocation service for iOS and android - GitHub - Agontuk/react-native-geolocation-service: React native geolocation service for iOS and android

github.com

https://github.com/voximplant/react-native-foreground-service

 

GitHub - voximplant/react-native-foreground-service: React native module to start foreground service on android

React native module to start foreground service on android - GitHub - voximplant/react-native-foreground-service: React native module to start foreground service on android

github.com

* 위 두가지 라이브러리를 조합해서 문제를 해결해보려 했으나, 결국에는 실패했다. 맨 처음 소개한 라이브러리를 사용한다면 커스터 마이징에서 좀 불리한것같은 느낌이 들었다. 그러므로 커스터마이징을 더 하려고 한다면 위 두가지를 조합해서 해결해보길 바란다.

 

1. 첫 테스트는 폭망

처음 산책기록 기능을 구현할때 조건이 2가지가 있었다.

  • 주기적으로 위치를 기록할 것
  • 백그라운드에서도 안정적으로 기록할 것

주기적으로 위치를 기록하는 부분은 어려울게 없다. 그런데 백그라운드에서 위치를 기록을 해야하는 부분에 확신이 없었다. 잠금화면으로 전환이 되도 기록이 계속될까? 하는 생각에, react native background 이렇게 쳐서 뭔가 함수를 찾아봤다. 그랬더니 백그라운드 타이머라는 라이브러리가 눈에 띄었고, 해당 라이브러리를 사용해서, 주기적으로 위치를 기록하는 부분을 통으로 백그라운드에서 실행되게 코드를 작성했다. 안드로이드 에뮬레이터와, ios시뮬레이터에서도 안정적으로 동작하는것을 확인했다.

실 기기에서 테스트를 해봤다. 결과는 아주 처참했다.

왼쪽의 사진들이 직접 테스트를 해본 사진인데, 첫번째 사진이, 데이터를 확인하면서 산책을 한 부분이고, 두번째 사진이 사진 잠금 상태로 실행시킨 부분이다.

첫번째 사진을 보면, gps위치를 받아오는 기능의 정밀도가 생각보다 너무 안좋았다. 정밀도를 높이는 옵션(enableHighAccuracy)을 설정해야 하는걸로 보인다.

그리고 화면 잠금상태로 실행시켜보니, 전혀 기록을 안하고 있었다. 나는 코너를 돌면서 이동을 했는데, 그 부분이 하나도 기록이 안되었고, 중간중간에 잘되나? 확인하면서 볼때만 기록이 한번씩 되서, 대각선으로 기록이 된 모습을 볼 수있었다.

산책 기록은 거의 실패라고 봐야될것같다. 정밀도도 불만족스럽고, 백그라운드도 제대로 동작을 안하고 있었다. 이부분을 개선하기 위해서 자료조사를 해보았다.

 

2. 라이브러리 교체.

react native geolocation이라고 검색하면 community버전의 라이브러리가 보인다. 처음에 이 라이브러리를 사용했다. 하지만 정밀도를 높이는 enableHighAccuracy config를 설정하면 권한이 없다는 에러와 timeout에러가 자꾸 발생했다. 권한은 분명 할당해줬는데도 계속 오류가 났다. 정밀도를 낮추고는 도저히 만족스럽지 않은 결과가 나오기에, 다른 라이브러리를 찾아봤다.

react-native-geolocation-service 라는 라이브러리를 발견했다.

내가 겪는 문제를 해결한 버전으로 보인다. 바로 적용했더니 높은 정밀도의 gps데이터를 가져올 수 있었다. 게다가 이 라이브러리의 docs에서 친절하게 예제코드를 제공해 주고 있었다. 상당히 높은 퀄리티의 예제였다. 라이브러리의 기능을 다 사용할 수 있는 데모 앱도 제공을 해주고 있었다. 위치정보는 react-native-geolocation-service를 사용하면 위치정보를 잘 사용 할 수 있다.

3. 포그라운드? 백그라운드?

처음 백그라운드 동작을 수행하기 위해서 react-native-background-timer라는 라이브러리로 주기적으로 코드를 수행하게 만들었다. 그러다가, react-native-geolocation-service의 예제를 살펴보는데, 낯선 라이브러리를 발견했다. 그래서 검색을 해보니, 백그라운드 작업까지 가능하게 해주기능이 있었다.

뭔가 상식이 파괴되는 느낌이었다. 잠금상태나, 다른어플을 사용할때 동작을 하려면 백그라운드라고 생각을 했는데, 포그라운드 라이브러리로 해결할 수 있었다. 해당 내용을 검색해봤다.

[Android] 안드로이드 - background 서비스와 foreground 서비스의 차이점

 

[Android] 안드로이드 - background 서비스와 foreground 서비스의 차이점

백그라운드 서비스와 포그라운드 서비스의 가장 큰 차이점은, 사용자가 서비스의 존재에 대해 인지할 수 있는지 없는지에 대한 차이라고 볼 수 있다. 1. 백그라운드 서비스 (Background Service) 예를

salix97.tistory.com

내가 이해한 바로는, 포그라운드 서비스는 사용자에게 프로그램이 실행중이라고 인지를 시켜주는 기능을 하는 서비스라고 한다. 백그라운드는 반대로 사용자가 프로그램이 실행중인걸 인지하지 못하는 서비스이다. 이 라이브러리의 기본 기능은 상태 바에 어플리케이션이 실행중이라는 표시를 띄워주는 것이다. 하지만 포그라운드에서 동작 하는 어플리케이션은 프로그램이 백그라운드로 전환되어도 동작이 유지되는걸로 보인다.

왼쪽의 사진처럼 상단바에 표시가 되게된다. 이 상태에서 다른 어플리케이션을 사용하던, 잠금상태이던, 위치정보는 계속 기록된다. 백그라운드를 위한 다른 처리 없이, 포그라운드 서비스를 사용하게 된다면, 어플리케이션을 강제로 종료하지 않는 이상 계속 동작하게 된다. 종료를 시키더라도 계속 진행되게 할수있는지도 추가적으로 확인해야겠다.

 

왼쪽의 사진처럼 상단바에 표시가 되게된다. 이 상태에서 다른 어플리케이션을 사용하던, 잠금상태이던, 위치정보는 계속 기록된다. 백그라운드를 위한 다른 처리 없이, 포그라운드 서비스를 사용하게 된다면, 어플리케이션을 강제로 종료하지 않는 이상 계속 동작하게 된다. 종료를 시키더라도 계속 진행되게 할수있는지도 추가적으로 확인해야겠다.

 

 

추가로, 이 라이브러리를 처음 설치했을때는 오류가 발생했다. 라이브러리 설치경로가 안잡히는? 이상한 상황이었다. 그래서 처음 본 데모 앱의 버전인 2.0.0버전으로 낮춰서 설치했더니 해결이 되었다.

최종 결과물이다.

전보다 정밀도도 더 높아졌다. 백그라운드에서도 잘 기록을 하는 모습이다. 그리고 좀 자글자글하게 선이 그려지는데, 이부분은 더 보완을 해봐야겠다.

 

 

위치정보를 Tracking할 때, 주의할 점.

시뮬레이터와 에뮬레이터에서 제공하는 위치정보 데이터는 위치 측정 오차가 반영되지 않는 데이터이다. 에뮬레이터의 데이터를 보고 기록이 잘되네? 라고 생각하고 밖에서 실 기기를 통해 측정하게 되면, 지그재그로 기록되는 모습을 볼 수있다. 반드시 필터를 거쳐서 사용하자. 자료 조사를 할때 Kalman Filter가 많이 사용되는것을 확인했다. 참고하자.

 

잠금화면, 앱 전환 상태에서 어떻게 동작하는지 보고싶다면 꼭 실기기를 사용해서 테스트하자.