이 포스팅은 안드로이드 인앱업테이트 예제 코드입니다.
implementation 'com.google.android.play:app-update:2.0.1'
implementation 'com.google.android.play:app-update-ktx:2.0.0'
class InAppUpdate(activity: Activity) : InstallStateUpdatedListener {
private var appUpdateManager: AppUpdateManager
private var parentActivity: Activity = activity
private var currentType = AppUpdateType.IMMEDIATE
companion object {
const val TAG = "InAppUpdate"
const val MY_REQUEST_CODE = 500
const val IN_APP_UPDATE_RECEIVER = "InAppUpdateReceiver"
}
init {
appUpdateManager = AppUpdateManagerFactory.create(parentActivity)
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
appUpdateInfoTask.addOnSuccessListener { info ->
Log.d(TAG, "appUpdate")
//업데이트 가능여부 확인
if (info.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) { // 업데이트 가능
when(info.updatePriority()) {
5 -> { //즉시 업데이트
if (info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdate(info, AppUpdateType.IMMEDIATE)
}
}
4 -> {
val clientVersionStalenessDays = info.clientVersionStalenessDays()
if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 5 && info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdate(info, AppUpdateType.IMMEDIATE)
} else if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 3 && info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
startUpdate(info, AppUpdateType.FLEXIBLE)
}
}
3 -> {
val clientVersionStalenessDays = info.clientVersionStalenessDays()
if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 30 && info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdate(info, AppUpdateType.IMMEDIATE)
} else if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 15 && info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
startUpdate(info, AppUpdateType.FLEXIBLE)
}
}
2 -> {
val clientVersionStalenessDays = info.clientVersionStalenessDays()
if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 90 && info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
startUpdate(info, AppUpdateType.IMMEDIATE)
} else if (clientVersionStalenessDays != null && clientVersionStalenessDays >= 30 && info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
startUpdate(info, AppUpdateType.FLEXIBLE)
}
}
1 -> {
startUpdate(info, AppUpdateType.FLEXIBLE)
}
else -> {
startUpdate(info, AppUpdateType.IMMEDIATE)
}
} else{ // 업데이트 불가능
// 플래그 전달
Log.d(TAG, "업데이트 불가")
val intent = Intent(IN_APP_UPDATE_RECEIVER)
val broadcastManager = LocalBroadcastManager.getInstance(parentActivity)
intent.putExtra("flag", false)
broadcastManager.sendBroadcast(intent)
}
}
appUpdateManager.registerListener(this)
}
private fun startUpdate(info: AppUpdateInfo, type: Int) {
appUpdateManager.startUpdateFlowForResult(info, type, parentActivity, MY_REQUEST_CODE)
currentType = type
}
fun onResume() { //업데이트 진행중 확인
appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo: AppUpdateInfo ->
if (currentType == AppUpdateType.FLEXIBLE) {
// If the update is downloaded but not installed, notify the user to complete the update.
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED)
flexibleUpdateDownloadCompleted()
} else if (currentType == AppUpdateType.IMMEDIATE) {
// for AppUpdateType.IMMEDIATE only, already executing updater
// Log.d(TAG, "업데이트 즉시 실행" + appUpdateInfo.updateAvailability()) //1=업데이트 불가, 2=업데이트 가능
if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
startUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE)
}
}
}
}
private fun flexibleUpdateDownloadCompleted() {
val snack = Snackbar.make(
parentActivity.findViewById(R.id.activity_intro),
"An update has just been downloaded.",
Snackbar.LENGTH_INDEFINITE
)
snack.setAction("RESTART") { appUpdateManager.completeUpdate() }
.setActionTextColor(Color.WHITE)
.show()
}
fun onDestroy() {
appUpdateManager.unregisterListener(this)
}
override fun onStateUpdate(state: InstallState) {
if (state.installStatus() == InstallStatus.DOWNLOADED) {
flexibleUpdateDownloadCompleted()
}
}
}
class MainActivity : AppCompatActivity() {
private lateinit var inAppUpdate: InAppUpdate
//inAppUpdate 에서 업데이트 유무 확인
private var receiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val flag = intent.getBooleanExtra("flag", false)
if (!flag) {
Log.d(TAG, "update fail")
inAppUpdate.onDestroy()
} else {
Log.d(TAG, "update start")
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//인앱업데이트
inAppUpdate = InAppUpdate(this)
LocalBroadcastManager.getInstance(this).registerReceiver(
receiver,
IntentFilter(InAppUpdate.IN_APP_UPDATE_RECEIVER)
)
}
override fun onResume() {
super.onResume()
inAppUpdate.onResume()
}
override fun onDestroy() {
super.onDestroy()
inAppUpdate.onDestroy()
}
}
https://developer.android.com/guide/playcore/in-app-updates?hl=ko
https://write.agrevolution.in/in-app-updates-android-a9d50af18ff2