AppCenter Distribute

Firebase Distribute 를 사용하다가 배포된 apk 앱에서 최신 버전 유지가 필요해서 인앱업데이트 기능이 필요했다.
AppCenter 라는 Microsoft 에서 만든 sdk 가 있어서 이걸 사용해 보도록 했다.
Gradle Dependency 에는 다음과 같이 추가해 준다.

dependencies {
   def appCenterSdkVersion = '3.0.0'
   implementation "com.microsoft.appcenter:appcenter-distribute:${appCenterSdkVersion}"
}

그리고 인앱 업데이트 할 때 CustomDialog를 보여주기 위해 DistributeListener 인터페이스를 구현한 클래스를 하나만들어 준다.
클래스명은 임의로 InAppUpdateListener 라고 만들었다.

class InAppUpdateListener : DistributeListener {
    override fun onReleaseAvailable(
        activity: Activity?,
        releaseDetails: ReleaseDetails
    ): Boolean {
        activity?.apply {
            val dialogBuilder = AlertDialog.Builder(activity)
            dialogBuilder.setTitle(R.string.in_app_update)
            dialogBuilder.setMessage(R.string.msg_download_latest_version)
            dialogBuilder.setPositiveButton(R.string.common_confirm) { _, _ ->
                Distribute.notifyUpdateAction(UpdateAction.UPDATE)
            }
            dialogBuilder.setCancelable(false)
            dialogBuilder.create()
                .show()
            return true
        }
        return false
    }
}

Distribute.notifyUpdateAction(UpdateAction.UPDATE) 를 사용하게 되면 리턴을 true 로 셋팅 해준다.
return 을 false로 할 경우 액티비티 변경 될 때마다 콜백이 호출 될 수 있다.

Distribute.setUpdateTrack(UpdateTrack.PRIVATE)
Distribute.setListener(InAppUpdateListener())
AppCenter.start(application, BuildConfig.KEY_APP_CENTER_SECRET, Distribute::class.java)

테스트 그룹을 Private 으로 한 경우 첫번째줄 UpdateTrack 을 셋팅 해줘야 한다.
KEY_APP_CENTER_SECRET 는 앱의 시크릿 키 값이다. AppCenter Console -> Settings 우측 상단 메뉴 버튼 클릭

앱 업데이트가 필요한 곳에서 다음과 같이 호출

Distribute.setUpdateTrack(UpdateTrack.PRIVATE)
Distribute.setListener(InAppUpdateListener())
AppCenter.start(application, BuildConfig.KEY_APPCENTER_SECRET, Distribute::class.java)

유의할 점은 해당 versionCode 가 Distribute 에 업로드 되어 있다는 전제하에 업데이트 할 버전이 있다면 InAppUpdateListener onReleaseAvailable 가 호출 된다.
현재 versionCode 가 1 이고 Distribute 에 있는 버전이 2 버전이라면 콜백이 호출 되지 않는다.
Distribute 에는 1,2 현재버전까지 포함되서 올라가 있어야 호출됨.
그리고 Distribute 셋팅은 AppCenter.start 가 호출 되기 전에 호출 되어야 한다. 순서가 바뀔 경우 제대로 동작하지 않을수 있음.
AppCenterSecret Key 는 노출 되면 안되기 떄문에 환경변수에 저장해서 사용했다.

//앱 build.gradle

buildTypes {
        release {
            ...
        }

        debug {
            ...
        }

        buildTypes.each {
            it.buildConfigField 'String', 'KEY_APP_CENTER_SECRET', "\"$System.env.KEY_APP_CENTER_SECRET\""
        }
}

이번에 Github Actions 를 사용해서 Appcenter Distribute 에 apk 배포하는걸 자동화해서 작업을 했는데 그부분은 다음 글에서 올림.