우당탕탕 개발일지
[Unity] 구글 리뷰유도 구현 본문
https://developers.google.com/unity/packages?hl=ko#google_play
위 사이트에서 <인앱리뷰재생> 부분의 sdk를 다운받는다.
StoreReivew.cs
using System;
using System.Collections;
using UnityEngine;
#if UNITY_ANDROID
using Google.Play.Review;
#endif
public class StoreReview : MonoBehaviour
{
#region ## Instance ##
/// <summary>
/// 코루틴 사용을 위한 인스턴스
/// </summary>
private static StoreReview _instance;
private static StoreReview Instance
{
get
{
if (_instance == null)
{
var go = new GameObject("Store Review");
_instance = go.AddComponent<StoreReview>();
}
return _instance;
}
}
#endregion
#region ## File I/O ##
private static bool? _isAlreadyReview = null;
/// <summary>
/// 리뷰 요청한 적이 있는지 체크
/// </summary>
private static bool IsAlreadyReview
{
get
{
if (_isAlreadyReview == null)
{
_isAlreadyReview = PlayerPrefs.GetInt("StoreReview", 0) == 1;
}
return _isAlreadyReview.Value;
}
set
{
if (_isAlreadyReview != value)
{
_isAlreadyReview = value;
PlayerPrefs.SetInt("StoreReview", value ? 1 : 0);
}
}
}
#endregion
/// <summary>
/// 리뷰 팝업 요청하기
/// </summary>
public static void Open()
{
if (!IsAlreadyReview)
{
// 파일 저장 하기
IsAlreadyReview = true;
#if UNITY_ANDROID
RequestGooglePlayStoreReview();
#elif UNITY_IOS
RequestAppStoreReview();
#endif
}
else
{
// 잦은 노출은 정책 위반 또는 리뷰 팝업이 등장하지 않기 때문에 1회 요청으로 한정
Debug.Log("이미 리뷰 평점 요청을 한 적이 있습니다.");
}
}
/// <summary>
/// 구글 플레이 스토어 리뷰 평가 요청
/// </summary>
private static void RequestGooglePlayStoreReview()
{
#if UNITY_ANDROID
Instance.StartCoroutine(RequestGooglePlayStoreReviewCoroutine(() =>
{
if (Instance != null)
{
Destroy(Instance.gameObject);
}
}));
#endif
}
/// <summary>
/// 구글 플레이 스토어 리뷰 평가 요청 코루틴
/// https://developer.android.com/guide/playcore/in-app-review/unity?hl=ko
/// </summary>
/// <returns></returns>
private static IEnumerator RequestGooglePlayStoreReviewCoroutine(Action onFinished)
{
// 구글 리뷰 가이드
// '할당량'
// - 우수한 사용자 환경을 제공하기 위해 Google Play는 사용자에게 리뷰 대화상자를 표시할 수 있는 빈도에 관한 시간제한 할당량을 적용합니다.
// - 이 할당량으로 인해 짧은 기간(예: 1개월 미만) launchReviewFlow 메서드를 두 번 이상 호출할 경우 대화상자가 표시되지 않을 수도 있습니다.
#if UNITY_ANDROID
ReviewManager reviewManager = new ReviewManager();
var requestFlowOperation = reviewManager.RequestReviewFlow();
yield return requestFlowOperation;
if (requestFlowOperation.Error != ReviewErrorCode.NoError)
{
Debug.LogError("requestFlowOperation" + requestFlowOperation.Error);
//OpenGooglePlayStorePage();
onFinished?.Invoke();
onFinished = null;
yield break;
}
PlayReviewInfo playReviewInfo = requestFlowOperation.GetResult();
var launchFlowOperation = reviewManager.LaunchReviewFlow(playReviewInfo);
yield return launchFlowOperation;
playReviewInfo = null; // Reset the object
if (launchFlowOperation.Error != ReviewErrorCode.NoError)
{
Debug.LogError("launchFlowOperation: " + launchFlowOperation.Error);
//OpenGooglePlayStorePage();
onFinished?.Invoke();
onFinished = null;
yield break;
}
Debug.Log("Open Review Popup");
#endif
onFinished?.Invoke();
onFinished = null;
yield break;
}
/// <summary>
/// 구글 플레이 스토어 페이지 열기
/// </summary>
private static void OpenGooglePlayStorePage()
{
#if UNITY_ANDROID
Application.OpenURL($"market://details?id={Application.identifier}");
#endif
}
/// <summary>
/// 앱스토어 리뷰 평가 요청
/// </summary>
private static void RequestAppStoreReview()
{
// 앱스토어 가이드
// 1년에 최대 3번까지 평가를 요청할 수 있습니다.
#if UNITY_IOS
UnityEngine.iOS.Device.RequestStoreReview();
#endif
}
}
호출은 다음과같이 하면된다. PlayerPrefs 로 리뷰유도 창을 열었는지 정보를 저장한다. 디바이스를 변경하면 재등장할수도있으니, 추가적으로 스테이지 제한같은걸 걸어놓는것이 좋겠다
StoreReview.Open();
참고사이트
'Unity' 카테고리의 다른 글
[Unity] Build Err : unity exception: required API level 33. (0) | 2024.02.20 |
---|---|
[Unity] Build Error : unexpected element <property> found in <manifest><application> (0) | 2023.11.08 |
[Unity] Google Admob 광고보고 간헐적으로 튕기는 현상 (0) | 2023.11.02 |
[Unity]UGUI Particle Mask (0) | 2023.09.11 |
[Unity] 메일 문의하기 (1) | 2023.08.08 |