※ 본 글은 정보 공유성의 글이 아니라 개인 회고글에 가까우니 참고 바랍니다.
우선 Flutter 로 초보 개발자가 만보기 서비스를 런칭한다고 하면 어려울 수도 있을 것 같다는 생각이 든다.
단순히 걸음수만 표시해주는 간단한 기능이라면 그나마 낫겠으나 추가적으로 기능이 더 붙는다면 힘들 수 있을 것 같다는 내 개인적인 의견이다. 물론 사람마다 개발 실력이 다르다
아쉽게도 코드 공유 없이 설명을 이어나가야 할 것 같다.
나야 물론 코드를 공유하고 싶은 마음이 크지만 내가 개발한 서비스는 회사 소유이기에 코드를 공개할 수 없다.
하지만 헤맸던 과정을 블로그에 남겨 두는 것은 괜찮지 않을까
문제는 iOS
우선 우리 서비스는 안드로이드는 크게 문제가 없었다.
문제는 iOS 였다.
꽤나 많은 이슈가 있었고 테스트를 해보니 iOS 의 Pedometer 의 경우, 걸음수가 증가하다가 어느 순간 감소하는 경향이 있었다.
그 때 당시 우리들은 Pedometer 가 정상적이지 않다고 생각하였고 이를 막기 위한 방법을 고안해보고 적용하였으나 여전히 어떤 문제 때문인지 걸음수 문제가 해결되지 않았다.
신기했던 점
우리가 회사 내에 해 본 시도들은 다양했다.
토X, 캐시XX 등 타사 앱의 만보기 서비스와 건강앱과 함께 우리 앱과의 차이점은 무엇인지 2-3일간 테스트하였다.
여기서 놀라운 결과가 있는데 토X, 캐시XX 는 한 치의 오차 없이 정확히 걸음수가 일치했었다.
그런데 건강앱은 혼자 걸음수가 달랐다. (물론 우리 앱은 논외로 친다)
그런데 크게 다르다기 보단
건강앱은 걸음수를 확인해보았을 때 토X, 캐시XX 처럼 그 당시에 똑같지는 않았는데 일정 시간이 지난 후에 보면 똑같아져 있었다.
로컬 디비에 기록.. -> 문제를 찾았다
이 문제를 해결하기 위해 본부장님은 분명 어떤 방법이 있을 것이다 라며 앱 로컬 디비에 걸음수를 기록할 것을 요청하셨다.
그래서 우리는 걸음수가 올라올 때마다 디비에 기록하고 나중에 그걸 엑셀 파일로 열 수 있게끔 하였다.
엑셀 파일을 보고 본부장님은 원인을 파악하셨다.
우리의 문제는 iOS 에서는 백그라운드가 잘 돌지 않아 Pedometer 의 걸음수가 감소할 때 이를 보정해줄 수 있는 동작이 제때 이루어지지 않는 것이었다.
백그라운드를 돌게 만들자!
알다시피 iOS 의 백그라운드 동작은 굉장히 제한적이다.
우리는 백그라운드의 제한적인 환경을 우회적으로 피할 수 있을까 생각해본 것 같다.
첫 번째는 silent push 이고 두 번째는 오디오 플레이어였다.
그런데 오디어 플레이어는 오디오 기능이 들어가 있지 않은데 이 기능을 추가하면 앱 심사에 거절 당할 수가 있다고 한다.
그래서 제일 나아 보였던 방식이 silent push 였는데 이는 사용자가 알지 못하게 주기적으로 알림을 보내는 것이었다.
그런데 내가 생각하기에 이 silent push 로 백그라운드가 잘 돌게 할 수 있으려면 서버가 주기적으로 push 를 보내야 할 것 같다는 생각이 들었다. 앱에서 로컬로 silent push 를 보낸다 한들, 이 행동이 제대로 동작이 이루어진다고 보장할 수 있을까?
어떤 해결 방법도 정답이 아닌 것 같다.
앞서 말했듯 silent push 가 iOS 의 제한적인 백그라운드 환경을 피할 수 있을 것이라고 우리들은 판단하였고 위에서는 이를 구현할 것을 요청하셨다.
이때 나는 내 안에서 심한 갈등이 이루어진 것 같다.
'앱을 사용하지 않는데도 백그라운드를 돌게 하는 것이 맞는걸까?'
'그걸 구현할 수는 있지만 그게 정답은 아닌 것 같다'
'내가 이걸 해야 하는게 맞는 것 같지 않다'
이 수많은 갈등 속에서 내가 나랑 대화를 많이 한 것 같다.
자꾸 이건 아닌 것 같다는 생각이 들었고 iOS 의 만보기 구현 방식도 많이 검색해본 것 같다.
정답을 찾아버렸다
끊임없이 고민한 끝에 정답을 도출할 수 있었다.
이 정답은 생각보다 가까이에 있다. (참고로 Flutter 로 만보기 기능을 구현했던 블로그를 많이 찾아보았는데 이에 대한 정보가 없는 것이 아쉬웠다.)
나는 구현해본 결과, 토X, 캐시XX 와 같이 정확히 똑같은 걸음수를 구현해 낼 수 있었고 환호성을 질렀다. 😭
끝이 아니었다
나는 이때까지만 해도 다 됐다 라고 생각했었다.
그래서 본부장님께 말씀 드렸고 여기서부터 다시 개발 고난이 이어져 갔다.
우리 서비스는 자정에 걸음수를 초기화해야 하는데 걸음수 초기화가 제때로 이루어지지 않았다.
자정 초기화가 안되는 이유1
자정 초기화가 되지 않는 이유는 원래 Pedometer 자체에 자정 초기화 기능이 없다!
그래서 그건 개발자의 몫이 된다.
자정 초기화가 안되는 이유2
iOS 에서 날짜 변경을 감지하는 메서드가 있다.
근데 이것이 백그라운드 환경에서는 잘 동작하지 않는다고 한다.
이 메서드를 테스트해보았는데 정말 백그라운드에 진입할 때 이 알림이 막힌건지 아니면 다른 문제가 있었던 것인지 자정 초기화가 제대로 이루어지지 않았다.
확실하지 않다. 다만 내가 생각하기론 앱을 장기간 사용하지 않으면 백그라운드에 진입하게 되고 이때 이 알림 메서드가 그때 동작을 안한 것이 아닐까 하는 생각이 들었다.
아무튼 문제를 진단함에 있어서 이 이미지가 나에게 도움이 참 많이 됐었다.
자정 초기화 안되는 이유3
자정 초기화가 안되는 이유가 또 있다. 바로 Pedometer 는 그 날 걸음수가 없다면 걸음수를 보내지 않는다.
이건 테스트해보면서 알게 되었던 것이었는데
인터넷에 어떤 글을 찾아보아도 이에 대한 설명은 찾아볼 수 없었다는..
결국엔
결국 이 방법이 맞는지도 모르겠으나 그 방법으로(?) 구현해두었다.
어쨌든 배포한 시점 이후로는 잘 동작하고 있다.
지금도 이 방법에 대해서 끊임없이 생각 중이다.
다시 개발하라고 한다면 다른 방법으로도 시도해보고 싶은데 이미 잘 동작은 하고 있고 다른 개발 업무도 해야 하니..
캐시XX 는 테스트하면서 알았는데 자정에 제때 초기화되지 않는다.
아마 내가 생각한 캐시XX 구현 코드는
백그라운드에서 로컬 알림만 기능 동작하고 포그라운드에서는 inactive 에서 active 되는 상태 혹은 메인 페이지로 돌아올 때 날짜를 다시 확인하여 자정 초기화를 하지 않았을까 생각이 든다.
토X 는 백그라운드에서 알림을 보내지 않는다.
백그라운드 따위 신경 안써도 됨으로 한결 낫다. 다만 앱 실행 상태에서 정확히 12시 되는 순간 0으로 되는데 아까 말했던 날짜 변경 알림 메서드를 쓰지 않았을까 생각이 든다. 잘 확신은 서지 않는다.
아무튼 토X, 캐시XX 간에 이들은 네이티브이므로 좀 더 상세한 컨트롤이 가능하다는 것이다.
플러터가 두 OS 개발을 편리하게 해주는 기능이 있어서 좋은데 이를 더 잘 활용하려면 OS 에 대한 지식이 더 깊게 필요할 것 같다.
이번 업무로 많은 교훈을 얻었고 멀티 스레드 개념은 눈으로 직접 본 것은 아니기에 아직도 어려운 것 같다.
알고 싶은데 확인할 수 있는 방법도 적고 좀 더 경력을 쌓고 지식도 쌓아야겠다.
'⏳ 회고' 카테고리의 다른 글
2023 회고록 (0) | 2024.02.11 |
---|---|
광고 모듈화했던 경험 (0) | 2023.12.29 |
2022 회고록 (2) | 2023.01.02 |