Play In-App Update (인앱 업데이트) 방법
패키지 다운받기
https://developers.google.com/unity/packages?hl=ko#play_in-app_update
업데이트의 종류는 두 가지가 있는데 유연한 업데이트와 즉시 업데이트가 있다
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
업데이트 사용 가능 여부 확인 소스를 복사해서 붙여 넣어준다
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와 다르면
구글에서 그것을 판단하고 알아서 업데이트를 해준다