[안드로이드] 인앱업데이트?

YAMAMAMO·2024년 3월 4일
1

안드로이드

목록 보기
13/13

이 포스팅은 안드로이드 인앱업테이트 예제 코드입니다.

build.gradle 에 추가합니다.

  implementation 'com.google.android.play:app-update:2.0.1'
  implementation 'com.google.android.play:app-update-ktx:2.0.0'

InAppUpdate

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()
        }
    }
}

MainActivity

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

profile
안드로이드 개발자

0개의 댓글