๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฑ| Android/๐Ÿ“˜ | ๊ธฐ๋ก

[Android, Kotlin] android์—์„œ in-app updates๋กœ ์•ฑ ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ

by immgga 2023. 9. 9.

๋Œ€ํ‘œ ์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://www.91mobiles.com/hub/how-to-update-play-store-apps/

 

์ด๋ฒˆ์— ์ •๋ฆฌํ•  ์ฃผ์ œ๋Š” ๋ฐ”๋กœ ์•ฑ ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•œ ์‚ฌํ•ญ์ด๋‹ค.

๋‚ด๊ฐ€ ์ด๋ฒˆ์— ์•ฑ ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•œ ์ด์œ ๋Š” ํ•„์ž๊ฐ€ ์•ฑ์„ ํ•˜๋‚˜ ์ถœ์‹œํ•˜์˜€๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

0. ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ด๋Ÿฐ ๊ฒฝ์šฐ ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๋ฉด์„œ ์ˆ˜์ •ํ–ˆ๋˜ ์˜ค๋ฅ˜๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ธฐ์กด ์•ฑ์—์„œ๋Š” ๊ทธ๋Œ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚จ์•„์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ in-app updates๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

1. in-app updates๋Š” ๋ฌด์—‡์ผ๊นŒ?

in-app updates๋Š” ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ฐ”๋กœ ํ•„์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด๋Ÿฌ ๊ฐ€๊ธฐ ์ „์—!

 

in-app updates๋Š” 2๊ฐ€์ง€์˜ ์œ ํ˜•์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ flexible updates(๊ถŒ์žฅ ์—…๋ฐ์ดํŠธ)์™€ immediate updates(ํ•„์ˆ˜ ์—…๋ฐ์ดํŠธ)๊ฐ€ ์žˆ๋‹ค.

flesible updates๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ณ 

immediate updates๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฐ•์ œ์ ์œผ๋กœ ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๊ธฐ์— ์‚ฌ์ง„์„ ํ†ตํ•ด ๋น„๊ตํ•ด ๋ณด์ž.

1. flexible updates(๊ถŒ์žฅ ์—…๋ฐ์ดํŠธ)

 

2. immediate updates(ํ•„์ˆ˜ ์—…๋ฐ์ดํŠธ)

์œ„ 2๊ฐœ์˜ ์‚ฌ์ง„์œผ๋กœ ๋ณด๋ฉด ํ™•์—ฐํžˆ ์ฐจ์ด๋ฅผ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

1๋ฒˆ ์‚ฌ์ง„์€ ์—…๋ฐ์ดํŠธ ์•Œ๋ฆผ์ด bottom sheet ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. x ํ‘œ์‹œ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

2๋ฒˆ ์‚ฌ์ง„์€ ์ „์ฒด ํ™”๋ฉด์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹น์—ฐํžˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์•ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

 

์ด์ œ๋Š” ์ง„์งœ๋กœ ํ•„์ž๊ฐ€ ์‚ฌ์šฉํ•œ in-app updates ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋Ÿฌ ๊ฐ€๋ณด์ž.

์ฐธ๊ณ ๋กœ ํ•„์ž๋Š” immediate updates๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

2. immediate updates ์ฝ”๋“œ

๋จผ์ € dependency๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.(2023๋…„ 9์›” ๊ธฐ์ค€ ๋ฒ„์ „ 1.8.1)

implementation("com.google.android.play:core-ktx:1.8.1")

 

๊ทธ๋‹ค์Œ์— ์ž‘์„ฑํ•  ์ฝ”๋“œ๋Š” ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์„œ play store์˜ update ํ™”๋ฉด์„ ๋„์›Œ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ๋‹ค.

val appUpdateTask = appUpdateManager.appUpdateInfo

appUpdateTask.addOnSuccessListener { appUpdateInfo ->
    if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
        appUpdateManager.startUpdateFlowForResult(appUpdateInfo, IMMEDIATE, this, REQUEST_CODE)
    } else {
        // version is recent version
    }
}

updateTask ๋ณ€์ˆ˜๋กœ ์•ฑ์ด ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  if๋ฌธ์œผ๋กœ ์•ฑ์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ™”๋ฉด์„ ๋„์›Œ์ค„ ๊ฒƒ์ด๋‹ค.

else ๋ฌธ์—์„œ๋Š” ์•ฑ์ด ์ตœ์‹  ๋ฒ„์ „์ผ ๋•Œ์˜ ์ž‘์„ฑํ•  ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋  ๋“ฏํ•˜๋‹ค.

startUpdateFlowForResult์—์„œ IMMEDIATE๋ผ๋Š” object๊ฐ€ ์žˆ๋Š”๋ฐ ์ € ๋ถ€๋ถ„์„ FLEXIBLE๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด flexible updates ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ”์„ ๋•Œ์˜ ๋กœ์ง์„ ์ž‘์„ฑํ•ด ๋ณด๋„๋ก ํ•˜์ž.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == REQUEST_CODE) {
        if (resultCode != RESULT_OK) {
            // app ์ข…๋ฃŒ
            moveTaskToBack(true)
            finishAndRemoveTask()
            android.os.Process.killProcess(0)
        }
    }
}

๋ฐฉ๊ธˆ play store์˜ ํ™”๋ฉด์„ ๋„์šฐ๋Š” ์ฝ”๋“œ์—์„œ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ request code๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ request code๊ฐ€ onactivityresult์˜ requestcode์™€ ๊ฐ™์œผ๋ฉด ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

result code๊ฐ€ RESULT_OK๊ฐ€ ์•„๋‹Œ if๋ฌธ ์•ˆ์—๋Š” ์•ฑ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋กœ์ง์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” ์•ฑ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๋กœ์ง์„ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๋‹ค.

 

๊ทธ๋‹ค์Œ activity์˜ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ผ ๋กœ์ง์„ ์ž‘์„ฑํ•ด ์ค€๋‹ค.

onresume ์ฝ”๋“œ

override fun onResume() {
    super.onResume()

    appUpdateManager.appUpdateInfo.addOnSuccessListener { appUpdateInfo ->
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
            appUpdateManager.startUpdateFlowForResult(appUpdateInfo, IMMEDIATE, this, REQUEST_CODE)
        }
    }
}

onResume ์•ˆ์—์„œ๋Š” ์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ, ์—…๋ฐ์ดํŠธ๊ฐ€ ์•„์ง ์ง„ํ–‰ ์ค‘์ด๋ฉด ๋‹ค์‹œ play store์˜ ํ™”๋ฉด์„ ๋„์šฐ๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜ ์•ˆ์—๋„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์ •๋ฆฌ

์ด๋ฒˆ์— in-app updates๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์—…๋ฐ์ดํŠธ ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ์•ฑ ๋‚ด์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ฒˆ์—๋Š” ์•ฑ์„ ์ถœ์‹œํ•˜๊ณ  ๋‚˜์„œ in-app updates์˜ ์กด์žฌ(?)๋ฅผ ์•Œ๊ฒŒ ๋˜์–ด์„œ ๋’ค๋Šฆ๊ฒŒ ์ถ”๊ฐ€ํ–ˆ์—ˆ๋Š”๋ฐ, ๋‚˜์ค‘์—๋Š” ์ถœ์‹œ ์ „์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

์ฐธ๊ณ ํ•œ ๊ธ€

https://black-jin0427.tistory.com/212

 

[in-app updates] ์•ˆ๋“œ๋กœ์ด๋“œ ์ธ ์•ฑ ์—…๋ฐ์ดํŠธ ์‚ฌ์šฉ๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ธ”๋ž™์ง„์ž…๋‹ˆ๋‹ค. 2019 ๊ตฌ๊ธ€ IO์—์„œ ๋ฐœํ‘œํ•œ ๋‚ด์šฉ์ค‘ ์ธ ์•ฑ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ๊ธฐ๋ฅผ ์†Œ๊ฐœํ•ด ๋ณผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. In-App Update ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์•ฑ์„ ๊ตฌ๊ธ€ ์Šคํ† ์–ด์— ๋“ฑ๋กํ–ˆ์„ ๋•Œ ์•Œ๋ฆผ์„ ํ†ตํ•ด ์‚ฌ์šฉ

black-jin0427.tistory.com

https://developer.android.com/guide/playcore/in-app-updates

 

์ธ์•ฑ ์—…๋ฐ์ดํŠธ  |  Android ๊ฐœ๋ฐœ์ž  |  Android Developers

์ธ์•ฑ ์—…๋ฐ์ดํŠธ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด ์ •๋ฆฌํ•˜๊ธฐ ๋‚ด ํ™˜๊ฒฝ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ถ„๋ฅ˜ํ•˜์„ธ์š”. ์‚ฌ์šฉ์ž๋Š” ๊ธฐ๊ธฐ์—์„œ ์•ฑ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๋ฒ„๊ทธ

developer.android.com

 

728x90

๋Œ“๊ธ€