본문 바로가기
Achaive

Unity, 스토어별 리뷰 팝업 띄우기

by Client. DJ 2023. 5. 25.
반응형

구글 플레이 스토어 리뷰 팝업
앱스토어 리뷰 팝업

앱 내의 평점 유도 팝업

게임 평점 팝업을 띄우고 싶은 경우가 생깁니다. 이 점수는 실제로 앱 평가에도 많은 영향을 주고 참여도 및 점수가 높으면 앱이 조금이라도 더 노출될 확률이 생깁니다. 게임에 자연스럽게 오버레이가 되어 리뷰 요청을 하도록 기능을 넣을 수 있습니다.

라이브러리 설치 필요

앱스토어 리뷰 평가의 경우 유니티에서 내장 함수가 있으며, 구글 플레이 스토어 리뷰 평가는 따로 API를 사용해야합니다. 아래의 기능을 사용하기 전에 Play Core 라이브러리를 요구하기에 설치해주셔야 합니다.

스크립트

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
    }
}

예제

private void Start()
{
    // 자주 호출되어도 1번만 팝업이 열린다. (클라이언트 파일 저장 기록)
    StoreReview.Open();
}

마무리

여러 번 호출이 되어도 1번만 등장합니다. 예외로 장기간 삭제했던 유저가 재설치하는 경우에는 등장할 수 있습니다.

주의하실 점으로는 유저에게 높은 평점을 강요하거나 유도하는 방식으로 진행이된다면 스토어 정책 위반에 해당되기 때문에 자연스러운 흐름에서 만족도가 높은 시점에 호출하셔야합니다. :)


참고 1: https://developer.android.com/guide/playcore/in-app-review/unity?hl=ko

참고 2: https://docs.unity3d.com/ScriptReference/iOS.Device.RequestStoreReview.html

반응형

댓글