파이어베이스로 마켓에 출시된 앱 버전 체크하기

2021. 11. 16. 12:21개발/유니티

일단 파이어베이스도 서버이다.

용량제한이 있기때문에 아래의 방법으로도 버전체크가 가능하다.

case 1:
AF_initDataCallback({key:(?) 'ds:(?)', hash: '(?)', data:["(?)M","(버전)","(?) 이상"]
case 2:
<span class=""htlgb"">버전<

기본적으로 구글 마켓에 있는 버전정보는 이런 패턴을 보인다.

 

 

그럼 해당 패턴으로 웹페이지에 접속해서 찾으면 된다.

//버전체크

string url = "https://play.google.com/store/apps/details?id=패키지명";
UnityWebRequest webRequest = UnityWebRequest.Get(url);
yield return webRequest.SendWebRequest();

//case1
string pattern = @"M"",""[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}"",";
//case2
string pattern = @"<span class=""htlgb"">[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}<";


Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
Match match = _Regex.Match(webRequest.downloadHandler.text);


if(match != null)
{
    match = Regex.Match(match.Value, "[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}");
    
    string ver = match.value;
    
    Debug.log($"market version : {ver}");
}

 

[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}

이건 정규식으로 0.2.9.1같이 버전형식을 찾아낸다.

 

문제는 구글이 형식을 바꾸면 버전체크할 방법이 아예 없어진다.

아니면 패턴만 참조하는 어떤 링크라도 만들어줘야한다.

 

구글도 하지말라니까 일단은 파이어베이스를 써보기로 하자.

 

 

 

 

파이어베이스에는 Remote Config라는 기능이 있다.

파이어베이스에 프로젝트를 등록하고 json파일과 Remote Config에셋을 받자.

 

하는법은 파이어베이스 콘솔에 자세히 설명되어있으니 금방 따라할 수 있다.

 

문제는 사용법이다.

 

 

 

인터넷에 풀려있는 설명은 코드는 많은데 적용안되는 게 좀 많은 것 같다.

아님말고..

 

일단은 dotnet4버전이 기준이다.

 

using System;
using UnityEngine;
using Firebase.Extensions;
using System.Threading.Tasks;

public class MarketVersionChecker : MonoBehaviour
{
    isFirebaseInitialized = true;
    public void AppVersionCheck()
    {
    }
    
    void Init()
    {
    }
    
    void DisplayData()
    {
    }
    
    Task FetchDataAsync()
    {
    }
    
    void FetchComplete(Task fetchTask)
    {
    }
}

 

주의해야하는게 Remote Config에셋을 등록하면 Unity.Tasks dll이 두개가 생긴다.

경로는 Parse/ 안에 있는데, 이유는 잘 모르겠지만 두개가 중복되어서 코드에러가 발생한다.

 

뭔가 용도를 구분하기위해서 두 종류로 넣어둔거같은데 하나는 없어져야 코드가 작동하니 참고하자.

 

아무튼 Remote Config의 값을 받아오려면 위의 5가지 과정이 필요하다.

 

public void AppVersionCheck()
{
    Firebase.DependencyStatus dependencyStatus = Firebase.DependencyStatus.UnavailableOther;

    Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
        dependencyStatus = task.Result;
        
        if (dependencyStatus == Firebase.DependencyStatus.Available)
        {
            Init();
        }
        else
        {
            Debug.LogError(
              "Could not resolve all Firebase dependencies: " + dependencyStatus);
        }
    });
}
void Init()
{
    System.Collections.Generic.Dictionary<string, object> defaults =
      new System.Collections.Generic.Dictionary<string, object>();
    
    //Remote Config에 등록된 키와 값을 적어주자.
    defaults.Add("version", "0.0.0.1");

    Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.SetDefaultsAsync(defaults)
      .ContinueWithOnMainThread(task => {
          Msg.Log("RemoteConfig configured and ready!");
          isFirebaseInitialized = true;

          Invoke("FetchDataAsync", 0.5f);
      });

}
public Task FetchDataAsync(string param)
{
    Msg.Log(param);
    System.Threading.Tasks.Task fetchTask =
    Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.FetchAsync(
        TimeSpan.Zero);
    return fetchTask.ContinueWithOnMainThread(FetchComplete);
}
void FetchComplete(Task fetchTask)
{
    if (fetchTask.IsCanceled)
    {
        Msg.Log("Fetch canceled.");
    }
    else if (fetchTask.IsFaulted)
    {
        Msg.Log("Fetch encountered an error.");
    }
    else if (fetchTask.IsCompleted)
    {
        Msg.Log("Fetch completed successfully!");
    }

    var info = Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.Info;
    switch (info.LastFetchStatus)
    {
        case Firebase.RemoteConfig.LastFetchStatus.Success:
            Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.ActivateAsync()
            .ContinueWithOnMainThread(task => {
                Msg.Log(String.Format("Remote data loaded and ready (last fetch time {0}).",
                               info.FetchTime));

                Invoke("DisplayData", 0.5f);
            });

            break;
        case Firebase.RemoteConfig.LastFetchStatus.Failure:
            switch (info.LastFetchFailureReason)
            {
                case Firebase.RemoteConfig.FetchFailureReason.Error:
                    Msg.Log("Fetch failed for unknown reason");
                    break;
                case Firebase.RemoteConfig.FetchFailureReason.Throttled:
                    Msg.Log("Fetch throttled until " + info.ThrottledEndTime);
                    break;
            }
            break;
        case Firebase.RemoteConfig.LastFetchStatus.Pending:
            Msg.Log("Latest Fetch call still pending.");
            break;
    }
}
public void DisplayData()
{
    Msg.Log("Current Data:");
    Msg.Log("version: " +
             Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance
             .GetValue("version").StringValue);

    if (Application.version == Firebase.RemoteConfig.FirebaseRemoteConfig.DefaultInstance.GetValue("version").StringValue)
    {
        //최신버전
    }
    else
    {
        //버전 불일치
    }
}

 

이렇게 하면 앱의 버전 관리가 가능하다.

 

다만 앱을 실행할때만 갱신이되며 한번 갱신된상태면 다시 앱을 재실행할때까지는 config값이 적용되지 않는다.

 

이유는 잘 모르겠으나..

 

구글이 그런 의도로 만든거라 추측해본다. 아님말고

 

 

참고로 ios도 잘 작동되니 ios용 버전은 파라미터만 따로 만들면 된다.