Unity3D

서버 없이 App 버전 체크 후 업데이트 알림 띄우기 (version checking)

파인애옹 2021. 1. 5. 13:54

서버 대신 필요한 것 : Firebase Remote config sdk

 

※중요※

기존에 Firebase SDK가 설치되어 있다면 동일 묶음(버전그룹) 내의 sdk로 설치해야 함.

 

SDK import 후에는

Asset ->External Dependency Manager -> Package Manager Resolver -> Migrate Packages

Asset -> External Dependency Manager -> Android Resolver -> Force Resolve / Resolve

을 해 줘야 한다.

 

 

간단하게 프로세스를 설명하자면..

 

0) Firebase console의 Remote config에서 매개변수명과 값을 설정한다.

1) Firebase 초기화 

2) 초기화가 성공하면 Remote Config의 데이터와 싱크를 맞추고

3) 성공하면 FirebaseRemoteConfig.GetValue("매개변수명").Value타입 으로 설정 해 둔 값을 가져온다.

4) Application.version 으로 가져온 앱 버전값과 firebase에서 가져온 값을 비교해서 알림창을 띄운다..

 

1~3번의 순서가 하나라도 바뀌거나, 버전이 맞지않으면 초기화 오류가 뜬다..

 

Value타입에 LongValue도 있어서,, 버전을 쪼개서 올려 각각 Long으로 가져오니 자꾸 타입변환 에러를 뱉길래,

스트링으로 받아와서 변환해줬다..

 

 

이런저런 다양한 에러가 엄청 나와서.. 다양한 시도와 엄청난 검색 끝에

버전끼리 충돌이라는 것, 초기화와 다음 함수 호출 문제라는 것.. 등등을 알아냈다..

크롬 한국어 번역 너무 고맙고..

 

 

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


public class FirebaseSetting : MonoBehaviour
{ 
	
    private void Awake()
    {
        Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
        {
            dependencyStatus = task.Result;

            if (dependencyStatus == Firebase.DependencyStatus.Available)
            { 
            
            	InitializeFirebase();

            }
            else
            {
                UnityEngine.Debug.LogError(System.String.Format(
                  "Could not resolve all Firebase dependencies: {0}", dependencyStatus));
             }
        });

    }

    void InitializeFirebase()
    {
       
       Debug.Log("Firebase 초기화 완료"); 
        FetchDataAsync();

    }
  
  
     public Task FetchDataAsync()
    {
        Debug.Log("Fetching data..."); 
        System.Threading.Tasks.Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync(
            TimeSpan.Zero);

        return fetchTask.ContinueWithOnMainThread(FetchComplete);
    }
  
  
    void FetchComplete(Task fetchTask)
    {
        if (fetchTask.IsCanceled)
        {
            Debug.Log("Fetch canceled.");
        }
        else if (fetchTask.IsFaulted)
        {
            Debug.Log("Fetch encountered an error.");
        }
        else if (fetchTask.IsCompleted)
        {
            Debug.Log("Fetch completed successfully!");
            CheckVersion();

        } 

        var info = Firebase.RemoteConfig.FirebaseRemoteConfig.Info;
        switch (info.LastFetchStatus)
        {
            case Firebase.RemoteConfig.LastFetchStatus.Success:
                Firebase.RemoteConfig.FirebaseRemoteConfig.ActivateFetched();
                Debug.Log(String.Format("Remote data loaded and ready (last fetch time {0}).",
                                       info.FetchTime));
                break;
            case Firebase.RemoteConfig.LastFetchStatus.Failure:
                switch (info.LastFetchFailureReason)
                {
                    case Firebase.RemoteConfig.FetchFailureReason.Error:
                        Debug.Log("Fetch failed for unknown reason");
                        break;
                    case Firebase.RemoteConfig.FetchFailureReason.Throttled:
                        Debug.Log("Fetch throttled until " + info.ThrottledEndTime);
                        break;
                }
                break;
            case Firebase.RemoteConfig.LastFetchStatus.Pending:
                Debug.Log("Latest Fetch call still pending.");
                break;
        }
    }


    void CheckVersion()
    { 
        if (IsNeedUpdate())
        {
            //업데이트 알림 패널 활성화
        }
    }
    
    
    private bool IsNeedUpdate()
    {
        var server = Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("version").StringValue;
    
        var serverVersion = server.Split('.');
        
        int serverInt1 = 0; 
        int.TryParse(serverVersion[0], out serverInt1);
        int serverInt2 = 0;
        int.TryParse(serverVersion[1], out serverInt2);
        int serverInt3 = 0;
        int.TryParse(serverVersion[2], out serverInt3);

        var appVersionSplit = Application.version.Split('.');
        int app1 = int.Parse(appVersionSplit[0]);
        int app2 = int.Parse(appVersionSplit[1]);
        int app3 = int.Parse(appVersionSplit[2]);
  
        if (serverInt1 > app1) return true;
        if (serverInt2 > app2) return true;
        if (serverInt3 > app3) return true;

        return false;
    }

 
}

 

for문 써서 비교해줘도 됐지만,,

가끔은 이렇게 하나씩 쪼개는게 알기는 쉽더라.....