인앱 업데이트는 앱의 버전 관리를 위해 앱 실행 시 자동 업데이트를 지원해주는 기능입니다.
인앱 업데이트는 Android 5.0(API 수준 21) 이상에서만 작동합니다.
implementation 'com.google.android.play:core:1.9.0'
private void checkAppUpdate() {
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { // 업데이트 있음
requestUpdate(appUpdateInfo);
} else {
showSplash();
}
});
}
appUpdateManager 를 초기화 해준 후, 현재 업데이트 할 필요가 있는지 확인합니다.
appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.IMMEDIATE, this, REQUEST_CODE);
appUpdateManager.startUpdateFlowForReuslt 를 통해 업데이트 요청합니다.
업데이트 타입에는 IMMEDIATE, FLEXIBLE 의 두 가지가 있습니다.
IMMEDIATE 는 강제성을 띄고, FLEXIBLE 는 새로운 기능 추천하는 경우와 같이 사용자가 업데이트를 선택하여 진행 할 수 있습니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == REQUEST_CODE) {
if (resultCode != RESULT_OK) { // 업데이트 실패
Log.e(TAG, "Update flow failed! Result code: " + resultCode);
// 다시 업데이트
checkAppUpdate();
}
}
super.onActivityResult(requestCode, resultCode, data);
}
onActivityResult 를 통해 업데이트 결과를 받아와 실패한 경우 다시 업데이트하도록 합니다.
@Override
protected void onResume() {
super.onResume();
appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> { //업데이트 도중 앱을 stop 시켰다가 다시 실행 했을때 멈추진 않았는지 체크
if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
requestUpdate(appUpdateInfo);
}
});
}
업데이트 도중 사용자가 앱을 종료하는 경우가 있을 수 있습니다.
앱이 다시 foreground 로 돌아왔을 때, 업데이트가 완료되었는지 확인합니다.