본문 바로가기
안드로이드/구글

안드로이드 인앱 업데이트(유연한 업데이트, 즉시 업데이트) 적용하기

by 안드뽀개기 2022. 2. 11.
반응형

오늘은 제가 진행중인 프로젝트에 인앱 업데이트(유연한 업데이트, 즉시 업데이트)를 적용했던 과정을 적어보겠습니다. 

 

인앱 업데이트는 유연한 업데이트와 즉시 업데이트 두가지가 있습니다.

 - 유연한 업데이트는 앱을 업데이트하면서 앱을 사용할 수 있습니다.

 - 즉시 업데이트는 앱을 업데이트하는 도중에는 앱을 이용할 수 없습니다.



 저는 필수 업데이트에 대한 flag를 서버에 저장해두고, flag가 "0"이면 유연한 업데이트, "1"이면 즉시 업데이트를 적용했습니다.

 

requestUpdate() 메소드
 1. checkAppVersion("AOS") 함수는 서버의 저장된 앱의 버전, 업데이트 필수 여부 등을 호출하는 api입니다. 업데이트 여부를 통신으로 받아서 isEssential 변수에 필수 업데이트가 아니면 "0"을 필수 업데이트이면 "1"을 저장합니다.

필수 업데이트 여부에 따라서 각각에 맞는 업데이트를 호출합니다.
 - UpdateAvailability.UPDATE_AVAILABLE : 이전 버전과 비교하여 업데이트가 가능한지 확인합니다.

 - appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE 혹은 IMMEDIATE) : 각각의 업데이트 타입으로 업데이트 가능한지 확인합니다.
 - 즉시 업데이트일때는 onResume을 직접 호출합니다. 이유는 아래에서 설명드리겠습니다.

 - appUpdateManager.completeUpdate() : 유연한 업데이트가 완료가 되었을때 반드시 호출해야하는 함수입니다. 호출하지 않으면 업데이트가 되지 않습니다.

 저의 경우에는 앱을 사용하는 도중에 업데이트가 완료되면 dialog로 앱을 지금 재시작할지 아니면 나중에 할지 묻습니다. 지금 바로 재시작을 하면 appUpdateManager.completeUpdate()를 호출하여 재시작 및 업데이트를 마무리합니다. 나중에를 선택하게 되면 사용자가 스스로 앱을 재시작 했을때 requestUpdate() 메소드 안에 있는 appUpdateManager.completeUpdate()가 호출되면서 앱이 재시작 및 업데이트 됩니다. 

 앱을 사용하는 도중에 업데이트가 완료되면 dialog로 앱을 재시작할지 묻는 방법은 BaseActivity에 코드를 작성하여 모든 액티비티에 상속하면 됩니다. 이 코드는 하단에 첨부하겠습니다.

 

onActivityResult 메소드
requestUpdate()를 호출하여 업데이트가 가능하면 업데이드 여부를 뭍습니다. 그리고 사용자의 선택의 여부는 onActivityResult 메소드로 전달됩니다(onActivityResult가 deprecated 되었는데, 공식문서에는 이에 대한 방안을 찾을 수 없습니다. 이에 대해 아시는 분은 댓글로 남겨주시면 감사하겠습니다). resultCoderk RESULT_OK가 아니라는 것은 업데이트를 취소하겠다는 선택을 했을때입니다. 따라서 업데이트 취소에 대한 처리를 해주시면 됩니다. 저는 유연한 업데이트는 다음 화면으로 넘어가도록 했고, 즉시 업데이트는 앱을 종료하도록 했습니다.


onResume()

onResume은 업데이트 필수 여부를 받아오지 않았을때 실행되면 아무 역할을 하지 않습니다. onResume에 해당 코드를 작성한 것은 즉시 업데이트를 진행할 때, x버튼 혹은 네비게이션바의 뒤로가기 버튼 등을 눌렀을때 onResume()이 호출되어 다시 즉시 업데이트 화면으로 이동시키기 위함입니다. 위에서 onResume()을 직접 호출한 것은 서버에서 업데이트 필수여부가 즉시 업데이트일때 즉시 업데이트가 불가능한 상태이면 MainActivity(다음화면)으로 넘어가기 위함입니다.




BaseActivity.kt

위에서 설명한것과 같이 액티비티를 이동하다가 업데이트가 완료된 시점이 되면 dialog로 업데이트를 완료할지 묻는 로직이 있는 class입니다. installListener에서 얼마나 업데이트의 총 byte와 업데이트가 진행된 byte를 알 수도 있고, 다운로드가 완료되었는지 InstallStatus.DOWNLOADED로 알 수 있습니다. 주의할 점은 반드시 onDestory에서 installListener를 해제해 주셔야 메모리 손실을 막으실 수 있습니다.

인앱 업데이트를 구현하면서 가장 어려웠던 부분은 테스트입니다.. 테스트를 하려면 구글 개발자 콘솔에서 내부 앱 공유를 이용해 버전이 상이한 두개의 .aab 파일을 올려야 하는데 업로드 시간이 꽤 오래걸려서 테스트하는데 많은 시간이 소요됩니다.. 테스트 방법은 다음 포스팅에 자세히 다뤄보겠습니다. 감사합니다~

반응형