인앱 업데이트 | Other Play guides | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. 인앱 업데이트 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 사용자는 기기에서 앱을 최신 상태로
developer.android.com
플레이스토어에 앱을 최신 버전으로 배포했을 때, 앱을 사용하던 유저에게 업데이트 할 것을 알리고 싶을 때가 있다. 인앱 업데이트(in-app update)는 이것을 가능하게 하는 Google Play Core 라이브러리 기능이다.
업데이트 방식
유연한 업데이트(Flexible udpates)
유연한 업데이트는 사용자가 업데이트를 하는 동안 앱을 사용하는 경우에 적합하다. 이 방식은 앱 사용 흐름에 방해를 주지 않고 업데이트를 진행할 수 있다는 점이 특징이다. 백그라운드에서 업데이트가 진행되고, 업데이트가 완료된 후 앱이 재실행되어 새로운 버전을 사용할 수 있게 된다.
즉시 업데이트(immediate updates)
즉시 업데이트는 사용자의 앱 사용을 막고 업데이트를 우선하는 방식으로, 업데이트가 중요한 경우에 적합하다. 앱을 강제로 업데이트해야 하는 경우에 이 방식이 좋아 보인다.
in-app updates 적용하기
스플래시가 구현된 프로젝트는 스플래시 화면에서, 그렇지 않은 경우는 로그인 화면에서 앱 업데이트 체크를 진행하도록 했다. 즉시 업데이트 방식을 사용하여 사용자가 최신 버전을 사용할 수 있게끔 했다.
라이브러리 등록
build.gradle.kts(:app)
implementation("com.google.android.play:app-update-ktx:2.1.0")
in-app updates 라이브러리를 사용하기 위해 Gradle에 라이브러리를 등록시켜 준다.
업데이트 가능 여부 확인 및 업데이트
앱 업데이트를 체크하는 화면
private val appUpdateManager: AppUpdateManager by lazy {
AppUpdateManagerFactory.create(applicationContext)
}
private fun checkAppUpdate(intentType: Boolean) {
// PlayStore에서 설치된 경우 설치 경로가 "com.android.vending"으로 됨
val isRegisteredPlayStore = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // Android 11 기준
val info = packageManager.getInstallSourceInfo(packageName)
info.installingPackageName == "com.android.vending"
} else {
packageManager.getInstallerPackageName(packageName) == "com.android.vending"
}
// PlayStore에 등록된 앱 아닌 경우 앱 체크 안 하도록 처리
// 로컬 빌드는 앱 등록이 무조건 안 된 것으로 체크하여 addOnFailureListener를 타게 됨
if (!isRegisteredPlayStore) {
intentLogin(intentType)
return
}
appUpdateManager.appUpdateInfo
// PlayStore 통신 성공
.addOnSuccessListener { appUpdateInfo ->
if ((appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE))
|| appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
) {
// 업데이트 시작
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
this@SplashActivity,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build(),
100
)
} else {
intentLogin(intentType)
}
}
// PlayStore 통신 실패 (Ex- PlayStore에 앱 등록이 안 된 경우)
.addOnFailureListener { e ->
Toast.makeText(this, "앱 업데이트 실패", Toast.LENGTH_SHORT).show()
}
}
앱 업데이트를 요청하기 전에 앱이 먼저 업데이트가 필요한지를 확인해야 한다. AppUpdateManager를 사용하여 업데이트가 있는지 확인할 수 있다.
(appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
즉시 업데이트 가능한 상태인지
appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
이전 업데이트에서 중단된 상태인지
PlayStore에 앱이 등록된 경우 addOnSuccessListener 블록을 타게 되는데, 여기서 즉시 업데이트가 가능한 상태인지 그리고 이전의 업데이트에서 중단된 상태는 아닌지 확인한다.
이후 startUpdateFlowForResult()를 통해 업데이트를 시작한다. (업데이트 전체 화면으로 전환)
※ 참고
로컬 환경에서 빌드한 앱의 경우 PlayStore에 앱 등록이 안 된 것으로 판단하여 addOnFailureListener 블록이 실행된다. PlayStore에서 설치된 앱은 설치 경로가 "com.android.vending"으로 되어 있어서 구분이 가능하므로, 로컬 빌드인 경우에 대한 처리를 추가했다.
'Android > 기타' 카테고리의 다른 글
[Android] Flow와 StateFlow 사용해보기 (0) | 2024.03.26 |
---|