Android

[Android / JAVA] Firebase Remote Config로 강제/선택 업데이트 팝업 관리하기

evan.k 2023. 2. 7. 12:12

지난주에 같은 주제로 Swift에서 사용하는 방법을 올렸었는데 오늘은 Android(JAVA)에서 사용하는 방법을 올리려고 한다.

JAVA 역시 간단하게 구현이 가능하다.

왜 Remote Config 서비스를 사용했는지, 기본 세팅은 'Swift에서 사용법' 링크를 참고하면 될 것 같다.

 

사용법

먼저 firebase remote config dashboard에 원하는 매개변수를 저장한다.

그리고 저장해둔 매개변수를 불러온 후 값을 비교해 업데이트 팝업을 띄워주는 코드를 구현한다.

private void checkVersion() {
    String minimumVersion = "minimum_version";
    String forceUpdate = "force_update";

    FirebaseRemoteConfig mConfig = FirebaseRemoteConfig.getInstance();
    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings
            .Builder()
            .setMinimumFetchIntervalInSeconds(60 * 60 * 24 * 1)
            .build();

    HashMap defaultMap = new HashMap <String, String>();
    defaultMap.put(minimumVersion, "0");
    defaultMap.put(forceUpdate, "false");

    mConfig.setDefaultsAsync(defaultMap);
    mConfig.setConfigSettingsAsync(configSettings);

    mConfig.fetchAndActivate().addOnCompleteListener(
        this, new OnCompleteListener<Boolean>() {
            @Override
            public void onComplete(@NonNull Task<Boolean> task) {
                if (task.isSuccessful()) {
                    showUpdatePopUp(mConfig.getString(minimumVersion), mConfig.getString(forceUpdate));
                } else {
                    Timber.tag("").i("\n" + "[default :: " + String.valueOf(defaultMap.toString()) + "]");
                }
            }
        });
}

private void showUpdatePopUp(String fetchVersion, String force) {
    String versionName = BuildConfig.VERSION_NAME;

    Scanner minimumVersion = new Scanner(fetchVersion.replaceAll("\\D+",""));
    int minimumNumber = minimumVersion.nextInt();
    Scanner currentVersion = new Scanner(versionName.replaceAll("\\D+",""));
    int currentNumber = currentVersion.nextInt();

    forceUpdate = force;

    if (minimumNumber > currentNumber) {
        findViewById(R.id.dim_layout).setVisibility(View.VISIBLE); // 배경화면 dim 처리
        findViewById(R.id.dim_layout).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return true;
            }
        });
        
        final Button updateButton = findViewById(R.id.update); // 업데이트 버튼
        final TextView skipButton = findViewById(R.id.skipUpdate); // skip 버튼

	'''
        update pop up 렌더링 코드 추가
        '''
        
        if (force.equals("true")) {
            skipButton.setVisibility(View.GONE); // skip 버튼 숨기기
            updateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent storeIntent = new Intent(Intent.ACTION_VIEW);
                    storeIntent.addCategory(Intent.CATEGORY_DEFAULT);
                    storeIntent.setData(Uri.parse("market://details?id=com.icaremind.v2"));
                    findViewById(R.id.dim_layout).setVisibility(View.INVISIBLE);
                    startActivityForResult(storeIntent, UPDATE_REQUEST_CODE); // 플레이 스토어로 이동
                }
            });
        } else {
            skipButton.setVisibility(View.VISIBLE); // skip 버튼 보여주기

            skipButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    updateWrapper.setVisibility(View.GONE);
                    findViewById(R.id.dim_layout).setVisibility(View.INVISIBLE);
                }
            });

            updateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent storeIntent = new Intent(Intent.ACTION_VIEW);
                    storeIntent.addCategory(Intent.CATEGORY_DEFAULT);
                    storeIntent.setData(Uri.parse("market://details?id=com.icaremind.v2"));
                    findViewById(R.id.dim_layout).setVisibility(View.INVISIBLE);
                    startActivityForResult(storeIntent, UPDATE_REQUEST_CODE);
                }
            });

        }
    }
}

만약 강제 업데이트일 경우 플레이 스토어에서 업데이트 하지 않고 돌아온 경우를 생각해야 하기 때문에 startActivityForResult를 사용했고 결과값을 처리하기 위해 onActivityResult에 처리 코드를 추가해준다.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
	super.onActivityResult(requestCode, resultCode, data);
    
   if (requestCode == UPDATE_REQUEST_CODE && resultCode != RESULT_OK && forceUpdate.equals("true")) {
        checkUpdate();
    } // force update 이고 업데이트 하지 않은 경우 업데이트 팝업 다시 노출
    
    '''
}

 

코드를 실행시켜 보면 업데이트 팝업이 정상적으로 렌더링 되고 있는 것을 확인할 수 있다.