본문 바로가기
PROGRAMING📚/Unity📑

[UNITY]Play In-App Update (인앱 업데이트) 방법

별찌루 2024. 2. 3.
728x90
반응형
Play In-App Update (인앱 업데이트) 방법 

패키지 다운받기

https://developers.google.com/unity/packages?hl=ko#play_in-app_update

 

Unity용 Google 패키지 살펴보기  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English Unity용 Google 패키지 살펴보기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Unity용 Google

developers.google.com

 

업데이트의 종류는 두 가지가 있는데 유연한 업데이트와 즉시 업데이트가 있다

 

1. 유연한 업데이트

 

원활한 상태 모니터링 기능과 함께 백그라운드 다운로드 및 설치를 제공 해준다

즉, 다운로드 하는 동안 앱을 사용할 수 있음

 

2. 즉시 업데이트

 

사용자가 앱을 계속 사용하려면 앱을 업데이트하고 다시 시작해야한다

업데이트가 앱의 핵심 기능에 중요한 경우에 사용한다

사용자가 업데이트를 수락해야지 GooglePlay 가 업데이트를 설치하고 다시시작을 처리한다

즉, 강제로 앱을 업데이트 받도록하고 업데이트를 받지 않으면 진행 불가능

 

위의 사이트에 들어가서 인앱 업데이트 재생 부분의 .unitypackage 를 다운 받아주고

 

프로젝트 안에 해당 패키지를 설치를 해준다

 

패키지를 설치하는 방법은 Project 탭에 다운받은 패키지를 끌어 넣어주면

Import Unity Package 화면이 나온다

아니면 Assets-Import Package > Custom Package 로 들어가서

파일을 직접 선택해서 넣어줄 수 도 있다

 

이제 InAppUdate를 관리 할 스크립트를 하나 생성해준다

 In-App Update를 사용하기 위해서 유니티에서 제공하는 AppUpdateManager 클래스를 사용해야한다

using Google.Play.AppUpdate;

AppUpdateManager appUpdateManager = new AppUpdateManager();

 

AppUpdateManager를 사용하기 위해서 상단에 선언을 해주고

 

AppUpdateManager 클래스를 인스턴스화 했으면

이제 업데이트를 요청하기 전에 업데이트 사항이 있는지

다음 CheckForUpdate 코루틴을 사용해서 확인 할 수 있다

 

https://developer.android.com/guide/playcore/in-app-updates/unity?hl=ko#update-availability

 

인앱 업데이트 지원(Unity)  |  Android 개발자  |  Android Developers

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

developer.android.com

업데이트 사용 가능 여부 확인 소스를 복사해서 붙여 넣어준다

IEnumerator CheckForUpdate()
{
  PlayAsyncOperation<AppUpdateInfo, AppUpdateErrorCode> appUpdateInfoOperation =
    appUpdateManager.GetAppUpdateInfo();

  yield return appUpdateInfoOperation;

  if (appUpdateInfoOperation.IsSuccessful)
  {
    var appUpdateInfoResult = appUpdateInfoOperation.GetResult();
  }
  else
  {
    // Log appUpdateInfoOperation.Error.
  }
}

 

앱을 업데이트 해주기 위해서

 

1.  앱의 정보가 확인 되었는가 (27)

2. 업데이트가 가능한 상태인가 (31)

3. 어떻게 업데이트를 처리 할 것인가

 

순서대로 처리를 해주어야한다

 

3. 어떻게 업데이트를 처리 할 것인가

 

업데이트 처리 방법은 2가지가 있다고 했는데

처리 방법에 따라 작성하는 코드가 달라진다

 

유연한 업데이트 처리

  var appUpdateOptions = AppUpdateOptions.FlexibleAppUpdateOptions();

 

즉시 업데이트 처리

var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();

 

AppUdateOptions 객체를 확보 한후

AppUpdateManager.StartUpdate()를 호출하여

업데이트의 흐름을 요청 할 수 있다

       while (!startUpdateRequest.IsDone)
       {
          if(startUpdateRequest.Status == AppUpdateStatus.Downloading) 
           {
               Debug.Log("업데이트 다운로드가 진행 중입니다.");
           }
          else if(startUpdateRequest.Status == AppUpdateStatus.Downloaded) {
               Debug.Log("업데이트가 완전히 다운로드되었습니다.");
           }
           yield return null;
       }

 

업데이트가 완료되고 While 문을 빠져나오게 되면

앱 업데이트 설치를 트리거 해주어야한다

 var result = appUpdateManager.CompleteUpdate();

 

마지막 업데이트 확인을 해준다

                var result = appUpdateManager.CompleteUpdate();
                while (!result.IsDone)
                {
                    yield return new WaitForEndOfFrame();  
                }
                yield return (int)startUpdateRequest.Status;

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Google.Play.AppUpdate;
using Google.Play.Common;
public class InAppUpdate : MonoBehaviour
{
    AppUpdateManager appUpdateManager;
    private void Start()
    {
#if UNITY_EDITOR
#else
        StartCoroutine(CheckForUpdate());
#endif
    }
    IEnumerator CheckForUpdate()
    {
        //앱 초기화
        appUpdateManager = new AppUpdateManager();

        PlayAsyncOperation<AppUpdateInfo, AppUpdateErrorCode> appUpdateInfoOperation =
        appUpdateManager.GetAppUpdateInfo();
        // 앱 정보가 확인 될 때까지 기다림
        yield return appUpdateInfoOperation;

        if (appUpdateInfoOperation.IsSuccessful)
        {
            var appUpdateInfoResult = appUpdateInfoOperation.GetResult();
            //업데이트가 가능한 상태
            if (appUpdateInfoResult.UpdateAvailability == UpdateAvailability.UpdateAvailable)
            {
                //유연한 업데이트 처리 방법
                var appUpdateOptions = AppUpdateOptions.FlexibleAppUpdateOptions();
                var startUpdateRequest = appUpdateManager.StartUpdate(appUpdateInfoResult,appUpdateOptions);

                //즉시 업데이트 처리 방법
                /*var appUpdateOptions = AppUpdateOptions.ImmediateAppUpdateOptions();
                var startUpdateRequest = appUpdateManager.StartUpdate(appUpdateInfoResult,appUpdateOptions);
                yield return startUpdateRequest;*/

                //업데이트가 완료될 때 까지 기다림
                while (!startUpdateRequest.IsDone)
                {
                   if(startUpdateRequest.Status == AppUpdateStatus.Downloading) 
                    {
                        Debug.Log("업데이트 다운로드가 진행 중입니다.");
                    }
                   else if(startUpdateRequest.Status == AppUpdateStatus.Downloaded) {
                        Debug.Log("업데이트가 완전히 다운로드되었습니다.");
                    }
                    yield return null;
                }
                var result = appUpdateManager.CompleteUpdate();
                while (!result.IsDone)
                {
                    yield return new WaitForEndOfFrame();  
                }
                yield return (int)startUpdateRequest.Status;

            }
            //업데이트가 없는 경우
            else if (appUpdateInfoResult.UpdateAvailability == UpdateAvailability.UpdateNotAvailable)
            {
                Debug.Log("업데이트 없음");
                yield return (int)UpdateAvailability.UpdateNotAvailable;
            }
            else
            {
                Debug.Log("정보 없음");
                yield return (int)UpdateAvailability.Unknown;
            }

        }
        else
        {
            // appUpdateInfoOperation.Error를 기록한다
            Debug.Log("Error를");
        }
    }

}

 

AppUpdateInfo 클래스

AvailableVersionCode  사용 가능하거나 진행 중인 업데이트의 앱 버전 코드 또는 사용 가능한 업데이트가 없는 경우 임의의 값을 반환합니다
UpdateAvailability UpdateAvailability 업데이트 가용성을 반환합니다.
AppUpdateStatus AppUpdateStatus 업데이트 상태를 반환합니다
ClientVersionStalenessDays 사용자 장치의 Google Play Store 앱이 사용 가능한 업데이트에 대해 알고 있거나 업데이트 또는 정지 정보를 사용할 수 없는 경우 null인 일수를 반환합니다.
UpdatePriority 개발자가 Google Play Developer API의 "inAppUpdatePriority" 필드를 사용하여 정의한 대로 이 업데이트의 우선 순위를 반환합니다
BytesDownloaded 업데이트를 위해 이미 다운로드한 바이트 수를 반환합니다.
TotalBytesToDownload 업데이트를 위해 다운로드할 총 바이트 수를 반환합니다.
IsUpdateTypeAllowed Returns true if an update with the specified options is allowed, false otherwise.

 

 

UpdateAvailability 클래스

Unknown 업데이트 가능 여부를 알 수 없습니다.
UpdateNotAvailable 사용 가능한 업데이트가 없습니다.
UpdateAvailable 업데이트가 가능합니다.
DeveloperTriggeredUpdateInProgress 개발자가 업데이트를 트리거하여 진행 중입니다.

 

AppUpdateStatus 클래스

Unknown 업데이트 상태를 알 수 없습니다.
Pending 업데이트 다운로드가 보류 중이며 곧 처리됩니다.
Downloading 업데이트 다운로드가 진행 중입니다.
Downloaded 업데이트가 완전히 다운로드되었습니다.
Installing 업데이트를 설치하는 중입니다.
Installed 업데이트가 설치되었습니다.
Failed 업데이트가 실패했습니다.
Canceled 업데이트가 취소되었습니다.

 


프로젝트 셋팅

 

Edit > Project Setting > Player > OtherSetting

 

업데이트를 할 때 구글 콘솔에 올라가 있는

Bundle Version Code를 비교해서 업데이트를 한다

 

기존 프로젝트의 Bundle Code와 다르면

구글에서 그것을 판단하고 알아서 업데이트를 해준다

728x90
반응형

댓글