Android

[Android,Java] 안드로이드14 대응, 인앱 업데이트 하기

밤토리세상 2023. 11. 13. 15:07

앱을 실행하면서 마켓에 있는버전과 현재 실행한 버전이 다르면 업데이트를 진행하는 

인앱 업데이트를 해보려고한다.

이전에 사용하던 버전이 갑자기 리젝을 당하여 앱이 로드되지 않는다며 2주간 싸운결과

기존에 사용하던 인앱 업데이트 라이브러리가 디프리케이션이 되었고 

리뷰어는 아마도 안드로이드14 버전으로 하는듯 싶다

 

참고는 역시 그냥 디벨로퍼문서 

https://developer.android.com/guide/playcore/in-app-updates/kotlin-java?hl=ko

 

인앱 업데이트 지원(Kotlin 또는 자바)  |  Android 개발자  |  Android Developers

인앱 업데이트 지원(Kotlin 또는 자바) 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 가이드에서는 Kotlin이나 자바를 사용하여 앱에서 인앱 업데이트를 지

developer.android.com

 

(여기서 함정이 인앱 업데이트 정보 탭으로 가면 옛날 코드라는점.... 개삽질의 원흉)

 

우선 기존에 사용하던 라이브러리는 

implementation 'com.google.android.play:core:1.10.3'

 

이것을 사용했는데 이걸 로드해서 사용했을땐 디프리케이션에 대한 안내가 안나온다 

(코드상에 줄이 가면서 디프리케이션됫다 바꿔라 라고 알려주는)

 

그래서 개발문서를 보니 다른걸 쓰네?

 

implementation 'com.google.android.play:app-update:2.1.0'

 

자바일땐 이것을 사용하고 코틀린일때는

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

 

이녀석을 쓰라고한다

 

단 여기서 위에 구글플레이코어는 쓰지않고 app-update 를 쓰는데 

import 되는것도 다르다 코드는 거의 동일하게 쓰면서 말이다 이것때문에 삽질좀했는데

 

바로 결론으로 가자 

import 는 

import com.google.android.gms.tasks.Task;

 

이걸쓰면되고 기존은 아마 core.Task 였던거같다

 

그리고 이제 강제로 업데이트를 진행하기만 할것이기때문에 

 

 AppUpdateManager appUpdateManager;
 .
 .
 .
 
protected void onCreate(Bundle savedInstanceState) {
	...
    
    appUpdateManager = AppUpdateManagerFactory.create(mContext);
    Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();

    appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) ) {
            startUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE);
        }
    });
    
}

.
.
.

void startUpdate(AppUpdateInfo info,int type){
    appUpdateManager.startUpdateFlowForResult(
            // Pass the intent that is returned by 'getAppUpdateInfo()'.
            info,
            // an activity result launcher registered via registerForActivityResult
            activityResultLauncher,
            // Or pass 'AppUpdateType.FLEXIBLE' to newBuilder() for
            // flexible updates.
            AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build());
}

ActivityResultLauncher<IntentSenderRequest> activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(),result -> {
    if (result.getResultCode() != RESULT_OK) {
        // If the update is cancelled or fails,
        // you can request to start the update again.
		// 앱 업데이트를 안했을때 처리를 해주면됨.
    }else{
   	 	// 앱 업데이트를 진행되고 다시 돌아왔을경우 계속 진행되도록 작업.
    }

});

 

이런식으로 appUpdateManager를 이용해서 업데이트를 해준다 

 

activityResultLauncher 를 통해서 리퀘스트를 받기 때문에 여기서 분기해서 처리해주면된다 

앱이 재실행된다거나 하는 경우에는 동작하지 않을수도 있다고 공식문서에서도 나와있다 

하지만 저길 처리안하면 리뷰어가 다음으로 안넘어가지니 리젝을 시킬 수도?

 

그리고 만약 백그라운드로 내려가거나 업데이트중 멈추었다 다시 켯을때 계속 진행되게 작업도 해준다.

 

@Override
protected void onResume() {
    super.onResume();

    if(appUpdateManager!=null){
        appUpdateManager
                .getAppUpdateInfo()
                .addOnSuccessListener(
                        appUpdateInfo -> {
                            if (appUpdateInfo.updateAvailability()
                                    == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
                                // If an in-app update is already running, resume the update.
                                appUpdateManager.startUpdateFlowForResult(
                                        appUpdateInfo,
                                        activityResultLauncher,
                                        AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build());
                            }
                        });


    }

}

 

대충 요래 해주면 되는듯? 

 

이렇게해서 기존에 사용하던 인앱 업데이트를 갈아치우고 새로 작업해서 등록이 완료되었다.

 

애플처럼 뭐때문에 안되는지 정확히좀 알려주면 안되나 

맨날 매크로 답변만하고 지겹다 지겨워 

테스트하는 기기, 안드로이드 버전 , 해당 오류에서의 로그 등 지원되는게 하나도없다 

애플은 아주 상세하게 다 알려주는데 말이다