Notice
Recent Posts
Archives
Today
Total
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Recent Comments
관리 메뉴

우당탕탕 개발일지

[Unity] 구글 리뷰유도 구현 본문

Unity

[Unity] 구글 리뷰유도 구현

devchop 2023. 11. 8. 11:13

https://developers.google.com/unity/packages?hl=ko#google_play

 

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

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

developers.google.com

 

위 사이트에서 <인앱리뷰재생> 부분의 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();

 

 

 

참고사이트

https://moondongjun.tistory.com/106