들어가기 전
엄빠는 어렸다 1.1.0 버전 업데이트 과정에서 사용자에게 업데이트를 권유 할 수 있는 업데이트 팝업을 구현하고자 했다.
따라서 이 포스팅에서 업데이트 팝업을 구현하는 방법을 알아보고자 한다.
업데이트 팝업이란?
어플에 새로운 기능이 추가되거나 버그가 수정되어 업데이트가 필요한 경우가 발생할 수 있다.
이 때 어플을 실행시키면 사용자에게 업데이트가 필요함을 알리는 팝업을 업데이트 팝업이라 한다.
위 사진과 같이 사용자에게 업데이트를 유도할 수 있다.
엄빠도 어렸다 서비스에서는 업데이트 팝업을 구현하기 위해서 인앱 업데이트 방식을 활용하였다.
인앱 업데이트란?
구글은 안드로이드 5.0 이상을 사용하는 기기에 인앱 업데이트 기능을 지원하고 있다.
이는 구글 플레이스토어를 거치지 않고 앱 업데이트를 가능하게 하는 기능이다.
그리고 별다른 서버가 필요하지 않다.
앱을 실행할 때 해당 앱에 대한 업데이트 정보를 플레이스토어에서 가져와 업데이트 가능여부를 판단하고 앱 내부에서 업데이트를 통해 사용자가 스토어를 접속하지 않아도 업데이트 할 수 있는 것이다.
인앱 업데이트는 필수 (업데이트만 가능), 선택 (지금 or 나중에 가능) 업데이트를 모두 지원한다.
그리고 업데이트가 끝나면 앱이 바로 실행되어 이동을 최소화할 수 있다.
이 중 즉시 업데이트 방식을 선택했다.
업데이트 팝업 구현
엄빠도 어렸다 기획에서는 위 사진과 같이 커스텀된 업데이트 팝업이 띄워지도록 했기 때문에 바로 인앱 업데이트 팝업을 띄울 수가 없었다. 그래서 아래와 같은 방법을 생각했다.
1. 플레이스토어 버전과 현재 사용자가 설치한 버전을 비교하는 코드를 통해 업데이트 필요 여부를 판단한다.
2. 업데이트가 필요하면 shared preference의 값을 true로 설정, 필요하지 않으면 false로 설정
3. 앱을 접속할 때 shared preference 값을 확인 해 커스텀 업데이트 팝업을 띄운다.
3-1. 사용자가 x를 누르면 홈화면이 띄워지고, 다른 화면으로 갔다가 다시 홈으로 돌아오면 여전히 업데이트를 하지 않았기 때문에 팝업을 띄운다.
3-2 사용자가 업데이트를 누르면 인앱 업데이트 코드를 실행시켜 인앱 업데이트가 가능하도록 한다.
4. 업데이트가 완료되면 sharedpreference 값은 fales로 되므로 더이상 업데이트 팝업이 뜨지 않는다.
위 같은 방법으로 업데이트 팝업을 구현하고자 했다.
보통은 인앱 업데이트 코드만 작성해도 되는거지만, 커스텀된 업데이트 팝업을 띄워야했으므로 해당 과정을 거친것이다.
그러므로 아래 코드는 이 점을 유의해주길 바란다.
구현 코드 (즉시 업데이트 구현)
//인앱 Update
implementation 'com.google.android.play:app-update-ktx:2.1.0'
업데이트 가능여부 판단 코드
private fun isUpdateAvailable() {
val appUpdateManager = AppUpdateManagerFactory.create(this)
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(
AppUpdateType.IMMEDIATE
)
) {
SharedPreferences.setUpdateAvailableBoolean(IS_UPDATE_AVAILABLE, true)
Log.e("hyeon","${SharedPreferences.getUpdateAvailableBoolean(IS_UPDATE_AVAILABLE)}")
} else {
SharedPreferences.setUpdateAvailableBoolean(IS_UPDATE_AVAILABLE, false)
Log.e("hyeon","${SharedPreferences.getUpdateAvailableBoolean(IS_UPDATE_AVAILABLE)}")
}
}
}
companion object {
const val IS_UPDATE_AVAILABLE = "IS_UPDATE_AVAILABLE"
}
플레이스토어 버전과 비교해 현재 업데이트가 필요한 상황인지를 판단한다.
업데이트 Dialog 코드
private fun setBtnClickEvent() {
with(binding) {
btnClose.setOnSingleClickListener {
dismiss()
}
btnUpdate.setOnSingleClickListener {
requestUpdate()
}
}
}
private fun requestUpdate(){
val appUpdateManager = AppUpdateManagerFactory.create(requireContext())
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(
AppUpdateType.IMMEDIATE
)
) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
startForResult,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build()
)
}
}
}
함수 requestUpdate() 는 즉시 인앱 업데이트를 요청하는 코드이다.
dialog에서 업데이트 하기를 누르면 해당과정이 실행되도록 하였다.
이렇게하면 업데이트 팝업을 띄우고 인앱 업데이트를 할 수 있게된다.
인앱 업데이트 테스트 방법
사실 업데이트 팝업을 구현하는 방법은 공식문서에 잘 정리되어있어 수월했으나 테스트가 가장 어려웠다.
현재 스토어에 올라와있는 버전은 인앱 업데이트 코드가 반영되지 않은 버전이였다.
따라서 인앱 업데이트 코드를 반영한 버전을 다운받고, 그보다 더 높은 코드를 내부 테스트에 올려서 반영한 버전을 실행시켜 인앱 업데이트가 잘 작동하는지 확인할 수 있다.
즉 내부테스트에 버전 2개를 올려야 한다.
사전 준비
- Google Play 스토어 앱의 메뉴 > 설정에 들어간다.
- 정보란의 플레이스토어 버전을 6번 터치한다.
- 내부 앱 공유 옵션이 표시되면 사용을 설정한다.
1. 구글 플레이스토어 콘솔 내부앱 공유를 들어간다 -> https://play.google.com/console/u/0/internal-app-sharing
2.
인앱 업데이트 코드가 반영된 버전을 versionCode를 스토어에 올린 버전보다 +1한 뒤 앱 번들을 추출한다.
3. 해당 버전을 앱 번들을 콘솔 내부앱 공유에 올린다.
4. 그리고 올린 버전에 versionCode +1을 해서 번들을 또 추출하고 한번 더 올린다.
즉 위 사진처럼 versionCode를 높혀서 2개의 버전을 올린다.
5. 복사버튼을 통해서 링크를 복사하고 테스트 할 휴대폰에 링크를 접속해 처음 올린 버전을 설치한다.
6. 처음 올린 버전을 설치한 뒤 그보다 더 높은 버전의 링크를 들어간다. 업데이트 버튼이 있다면 누르지말고 처음 내부앱공유에 올린 버전 앱을 실행한다.
7. 업데이트 팝업이 뜨는걸 볼 수 있다.
나는 이 같은 방법으로 업데이트 팝업 테스트를 진행했다.
+) 내부테스트 시 카카오 로그인 키해시 오류
내부테스트 인증서도 카카오 디벨로퍼에 등록해주어야 한다.
내부테스트를 위해 내부 앱 공유로 앱을 설치 후 실행했더니 카카오 로그인이 안되는 문제가 발생했다.
이는 구글 플레이 콘솔에 설정 -> 내부 앱 공유 -> 내부 테스트 인증서로 들어간다.
SHA-1 인증서 값을 Base64로 전환하고 해당 값을 카카오 플랫폼 키해시 등록에 넣어주면 해결된다.
마치며
기획이나 프로젝트마다 개발 방법이 다를 수 있으므로 그 점을 유의해서 포스팅을 봐주면 좋겠다.
이 글이 인앱 업데이트를 테스트 및 구현하는 개발자들에게 도움이 되길 바란다.
'Android > 프로젝트 개발' 카테고리의 다른 글
[Android/JAVA] Zxing 활용 바코드/QR 스캐너 구현하기 (0) | 2024.08.07 |
---|---|
[Android] Retrofit에서 XML 데이터 통신 및 파싱 방법 / RecyclerView XML 데이터 받아오기 (0) | 2024.02.26 |
[Android] registerForActivityResult로 팝업 Activity를 만들어보자 (0) | 2023.08.26 |
[Android] 안드로이드 MaskFilter로 blur 효과 구현하기 (0) | 2023.08.07 |
[SWith] 검색 무한스크롤 (0) | 2022.09.24 |