TIL - 16 # Android 인앱 업데이트 안드로이드 앱을 운영하면서 강제 업데이트 시 사용자 이탈률에 대해서 걱정해보신 적이 있으신가요? API가 변경되거나, 큰 기능이 나가게 될 때, 불가피하게 강제 업데이트를 진행해야 할 수도 있습니다. 보통 서버에서 버전 정보를 가져와서 강제 업데이트 여부를 검사하고 팝업을 띄워서 스토어로 이동 후 업데이트가 완료하면 실행하는 플로우로 구현하는 방법이 있습니다. 하지만 이 경우에는 사용자가 스토어로 이동하다가 업데이트하지 않거나, 스토어 자체에서 삭제하는 경우가 발생할 수 있습니다. 그러면 좀 더 유연하게 업데이트를 처리하는 방법이 있을까요? 구글에서 PlayStore In-app update 라이브러리를 통해서 인앱에서 업데이트를 할 수 있는 방법을 제공합니다. ## 인앱 업데이트 종류 인앱 업데이트에서는 두가지 방법을 제공합니다. - 즉시 업데이트 (Immediate Update) - “앱을 계속 사용하려면 사용자가 앱을 업데이트하고 다시 시작해야 하는 전체 화면 사용자 환경입니다. 이 UX는 업데이트가 앱을 계속 사용하는 데 중요한 경우에 가장 적합합니다. 사용자가 즉시 업데이트를 수락하면 Google Play가 업데이트 설치 및 앱 다시 시작을 처리합니다.” - 유연한 업데이트 (Flexible Update) - “원활한 상태 모니터링 기능과 함께 백그라운드 다운로드 및 설치를 제공하는 사용자 환경입니다. 이 UX는 사용자가 업데이트를 다운로드하는 동안 앱을 사용할 수 있는 경우에 적합합니다. 예를 들어 사용자에게 앱의 핵심 기능과는 크게 상관없는 새 기능을 사용해 보도록 유도하고자 할 때 사용할 수 있습니다.” ## 구현 방법 구현 방법은 해당 문서를 참고 바랍니다. - https://developer.android.com/guide/playcore/in-app-updates/kotlin-java#kts - Google Play Developer API를 사용하면 버전 관리도 가능합니다. ## 트러블슈팅 - Splash에서 유연한 업데이트를 구현할 때 다운로드 시작 후 홈에서 업데이트 완료가 되면 *`InstallStateUpdatedListener`* 를 통해서 SnackBar을 띄우고 싶었는데 홈에 이동 전에 이미 업데이트가 완료가 되면 해당 이벤트를 못 받는 것을 확인했습니다. 이를 해결하기 위해서 onResume에서 "AppUpdateManager.appUpdateInfo.addOnSuccessListener”를 추가해서 “`appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED`” 즉 이미 다운로드가 완료되었을 경우 snackbar 처리해서 해결하였습니다. ## 테스트 방법 - 내부 테스트를 통해서 테스트를 진행할 수 있습니다. 낮은 버전을 업로드한 뒤 높은 버전을 업로드하여서 테스트가 가능합니다. - 실제 업로드한 앱과 동일 키 및 동일 패키지 명이면 테스트할 수 있습니다. 버전 코드를 실제 스토어에 업로드된 버전보다 낮춰서 빌드하면 테스트할 수 있습니다. - Unit Test로도 가능합니다. “AppUpdateManager”대신 “FakeAppUpdateManager”로 생성해서 Unit test가 가능합니다. ## 참고 - https://developer.android.com/guide/playcore/in-app-updates