본문 바로가기

Android

[Android]안드로이드 앱 최신 버전 체크(with Firebase Remote Config)

반응형

이전 포스팅중에 하나인

[Android]안드로이드 앱 마켓 버전 체크에서 사용하던 코드는 이제 사용이 불가능합니다.

(현재 코드를 일부 수정하여 사용 가능합니다)

그렇기에 미루고 미루어두었던 Firebase의 Remote Config를 통해 앱 버전을 체크하는 방법에 대해 알아보겠습니다.

이번 포스팅에서 설명하는 소스코드는 GitHub에서 만나보실 수 있습니다.




우선 Firebase에 새로운 프로젝트를 생성합니다.

원하는 프로젝트 이름을 정하시고 국가/지역을 선택합니다.





프로젝트 생성이 완료된 후 

Android앱에 Firebase 추가 버튼을 클릭합니다.





Firebase를 추가하고자하는 안드로이드 프로젝트의 패키지 이름을 입력합니다.

아래 입력사항들은 선택사항이니 생략하셔도 됩니다.





다운로드 google-services.json 버튼을 클릭하여 다운받은 후

안내와 같이 앱 모듈 디렉토리에 옮겨둡니다.





안내와 같이 Gradle에 의존성을 정의합니다.

저는 안내에 나와있는 버전이 아닌 15.0.0 버전으로

compile 이 아닌 implementation을 사용했습니다.





여기까지 완료하셨으면 기본적인 파이어베이스 설치가 완료되었습니다.

우리는 Remote Config 기능을 사용할 것 이기에 

Gradle에 Remote config를 추가하겠습니다.


1
implementation 'com.google.firebase:firebase-config:15.0.0'
cs



이제 파이어베이스의 Remote Config에 우리가 사용할 변수들을 추가하겠습니다.
GROW의 Remote Config를 클릭하여 이동합니다.




첫 번째 매개변수 추가 버튼을 클릭합니다.





저는 간단하게 latest_version이라는 키에 1.0.2의 값을 지정하여 추가하였습니다.

조건 값을 추가하여 보다 다양한 환경을 설정할 수 있지만 여기서는 생략하겠습니다.

앱을 서비스하실 때는 플레이스토어에 업로드한 최신 앱 버전으로 값을 정하시면 되겠습니다.





매개변수를 추가하고 변경사항 게시를 클릭하셔야합니다.

그렇지 않으면 우리가 추가하거나 변경한 변수값들이 반영이 되지 않습니다.





여기까지 파이어베이스의 Remote Config를 설치하고 매개변수를 추가하는 과정이었습니다.

이제부터는 안드로이드 소스코드를 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private fun remoteConfigInit() {
        //  developer mode enable when debug
        val configSettings = FirebaseRemoteConfigSettings.Builder()
                .setDeveloperModeEnabled(BuildConfig.DEBUG)
                .build()
 
        // set in-app defaults
        val remoteConfigDefaults = HashMap<String, Any>()
        remoteConfigDefaults["latest_version"= "1.0.0"
 
        // FirebaseRemoteConfig init
        FirebaseRemoteConfig.getInstance().apply {
            setConfigSettings(configSettings)
            setDefaults(remoteConfigDefaults)
            // every 60 minutes refresh cache
            // default value is 12 hours
            fetch(60).addOnCompleteListener({ task: Task<Void> ->
                if (task.isSuccessful) {
                    Log.d("RemoteConfig""remote config is fetched.")
                    activateFetched()
                }
            })
        }
    }
cs



위의 코드는 Remote Config 객체를 초기화해주는 코드입니다.

set in-app defaults라고 주석처리한 부분은

파이어베이스의 remote config에 추가한 매개변수의 디폴트 값을 설정해주는 과정입니다.

즉, 정의한 매개변수 값들을 받아오지 못했을 경우에 사용할 기본 값들입니다.

여러개의 매개변수를 등록하였고, 그 값들의 기본값을 설정해주고 싶으시면 추가로 설정하시면 됩니다.

저는 해당 코드를 Application 클래스에 두고 사용합니다.




1
2
3
4
5
6
7
8
9
10
11
12
private fun checkGooglePlayServices() {
        val googleApiAvailability = GoogleApiAvailability.getInstance()
        val status = googleApiAvailability.isGooglePlayServicesAvailable(this)
 
        if (status != ConnectionResult.SUCCESS) {
            val dialog = googleApiAvailability.getErrorDialog(this, status, -1)
            dialog.setOnDismissListener { _ -> finish() }
            dialog.show()
 
            googleApiAvailability.showErrorNotification(this, status)
        }
    }
cs


위의 코드는 구글 플레이 서비스 설치 여부를 파악하는 코드입니다.

구글 플레이 서비스가 설치되어 있지 않으면 Remote Config를 사용할 수 없습니다.

구글 플레이 서비스가 설치되어 있지 않은 안드로이드 스마트폰은 거의 없다고 봐도 무방하기에 생략하셔도 괜찮을 것 같지만

혹시 모르는 상황에 대비하여 체크하고 넘어가시는게 좋을 것 같습니다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
private fun getAppVersion(context: Context): String {
        var result = ""
 
        try {
            result = context.packageManager
                    .getPackageInfo(context.packageName, 0)
                    .versionName
            result = result.replace("[a-zA-Z]|-".toRegex(), "")
        } catch (e: PackageManager.NameNotFoundException) {
            Log.e("getAppVersion", e.message)
        }
 
        return result
    }
cs


현재 설치된 앱의 버전을 확인하는 코드입니다.

문자는 제거하고 버전 숫자만 리턴하도록 되어있습니다.

(ex: v1.0.0 -> 1.0.0)




1
2
val remoteConfig = FirebaseRemoteConfig.getInstance()
val latestVersion = remoteConfig.getString("latest_version")
cs

Remote Config의 매개변수 값을 가져오는 코드입니다.

latest_version이라는 키의 value를 가져옵니다.




아래의 코드는 버튼을 클릭하여 현재의 앱 버전과 Remote Config에 등록한 'latest_version'의 값을 가져와서

TextView에 보여주고 버전이 다르다면 AlertDialog를 보여주는 메인액티비티 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        checkGooglePlayServices()
 
        button.setOnClickListener { checkVersion() }
    }
 
    private fun checkGooglePlayServices() {
        val googleApiAvailability = GoogleApiAvailability.getInstance()
        val status = googleApiAvailability.isGooglePlayServicesAvailable(this)
 
        if (status != ConnectionResult.SUCCESS) {
            val dialog = googleApiAvailability.getErrorDialog(this, status, -1)
            dialog.setOnDismissListener { _ -> finish() }
            dialog.show()
 
            googleApiAvailability.showErrorNotification(this, status)
        }
    }
 
    private fun checkVersion() {
        val remoteConfig = FirebaseRemoteConfig.getInstance()
 
        val latestVersion = remoteConfig.getString("latest_version")
        val currentVersion = getAppVersion(this)
 
        currentAppVersion.text = currentVersion
        latestAppVersion.text = latestVersion
 
        if (!TextUtils.equals(currentVersion, latestVersion)) {
            showUpdateDialog()
        }
    }
 
    private fun getAppVersion(context: Context): String {
        var result = ""
 
        try {
            result = context.packageManager
                    .getPackageInfo(context.packageName, 0)
                    .versionName
            result = result.replace("[a-zA-Z]|-".toRegex(), "")
        } catch (e: PackageManager.NameNotFoundException) {
            Log.e("getAppVersion", e.message)
        }
 
        return result
    }
 
    private fun showUpdateDialog() {
        val dialog = AlertDialog.Builder(this)
                .setTitle("New version available")
                .setMessage("Please, update app to new version")
                .setPositiveButton("Update", { dialog, _ -> dialog.dismiss() })
                .setNegativeButton("No, thanks", { dialog, _ -> dialog.dismiss() })
                .create()
        dialog.show()
    }
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class BaseApplication : Application() {
    override fun onCreate() {
        super.onCreate()
 
        remoteConfigInit()
    }
 
    private fun remoteConfigInit() {
        //  developer mode enable when debug
        val configSettings = FirebaseRemoteConfigSettings.Builder()
                .setDeveloperModeEnabled(BuildConfig.DEBUG)
                .build()
 
        // set in-app defaults
        val remoteConfigDefaults = HashMap<String, Any>()
        remoteConfigDefaults["latest_version"= "1.0.0"
 
        // FirebaseRemoteConfig init
        FirebaseRemoteConfig.getInstance().apply {
            setConfigSettings(configSettings)
            setDefaults(remoteConfigDefaults)
            // every 60 minutes refresh cache
            // default value is 12 hours
            fetch(60).addOnCompleteListener({ task: Task<Void> ->
                if (task.isSuccessful) {
                    Log.d("RemoteConfig""remote config is fetched.")
                    activateFetched()
                }
            })
        }
    }
}
cs



Custom Application 클래스를 작성하셨으면
꼭 AndroidManifest에 명시해주셔야합니다.

1
2
<application
        android:name=".BaseApplication"
cs



 



아래는 결과 스크린샷 및 동영상입니다.






파이어베이스의 Remote Config 기능을 이용하여 앱 버전을 비교해보는 방법에 대해 알아보았습니다.

지금은 단순히 버전 비교하는 동작만 구현을 해보았지만

다양한 매개변수를 통해서 보다 유용한 동작들(설치된 앱 버전에 따른 사용자 동작 구현 다양화)을 구현하실 수도 있을겁니다.




해당 소스코드는 GitHub에 올려져있습니다.

직접 사용해보고 싶은신 분들은 본인의 firebase google-services.json 파일을 추가하고 매개변수를 등록하셔서 사용하실 수 있습니다.







반응형