์ด๋ฒ์ ์ ๋ฆฌํ ์ฃผ์ ๋ ๋ฐ๋ก ์ฑ ์ ๋ฐ์ดํธ์ ๊ดํ ์ฌํญ์ด๋ค.
๋ด๊ฐ ์ด๋ฒ์ ์ฑ ์ ๋ฐ์ดํธ์ ๊ดํด ์ ๋ฆฌ๋ฅผ ํ ์ด์ ๋ ํ์๊ฐ ์ฑ์ ํ๋ ์ถ์ํ์๋๋ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋๋ฐ ์ฌ์ฉ์๋ค์ด ์ฑ ์ ๋ฐ์ดํธ๋ฅผ ํ์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค.
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
https://developer.android.com/guide/playcore/in-app-updates