🕌

Unityアプリ起動時にGitHub ReleaseTagから最新versionの比較を行う

2025/01/30に公開

はじめに

OSSのデスクトップマスコット「uDesktopMascot」を開発しています。こちらのアプリは(記事作成時)1週間ごとにリリースをしています。

https://github.com/MidraLab/uDesktopMascot

そのため、ユーザーの方が自分が最新verを触っているのかが分からないようになってしまっています。
そのため以下のような最新verがリリースされていた場合にダイアログを出す機能を実装しています。


(画面は開発画面です)

開発環境

  • Unity 6000.0.31f1(IL2CPP)

リリースの比較

最新リリースの確認方法として、GitHub Tagを使って比較を行います。

以下のコードにて、GitHub Releaseの最新Tagを取得します


        private async UniTask<string> GetLatestVersionAsync(CancellationToken cancellationToken)
        {
            using UnityWebRequest request = UnityWebRequest.Get(LatestReleaseUrl);
            // GitHub APIにはUser-Agentヘッダーが必要
            request.SetRequestHeader("User-Agent", "uDesktopMascot");

            // リクエストを送信し、完了を待機
            await request.SendWebRequest().WithCancellation(cancellationToken).SuppressCancellationThrow();

            if (request.result != UnityWebRequest.Result.Success)
            {
                Log.Error($"最新バージョン取得のエラー: {request.error}");
                return null;
            }

            // レスポンスのJSONを取得
            string jsonResponse = request.downloadHandler.text;

            // JSONをパースして最新リリース情報を取得
            LatestReleaseInfo latestRelease = JsonUtility.FromJson<LatestReleaseInfo>(jsonResponse);

            if (latestRelease != null && !string.IsNullOrEmpty(latestRelease.tag_name))
            {
                // タグ名から先頭の 'v' または 'V' を除去
                return latestRelease.tag_name.TrimStart('v', 'V');
            }
            else
            {
                Log.Error("最新リリース情報の取得に失敗しました。");
                return null;
            }
        }

またレスポンスをjsonに変換するクラスです

        [Serializable]
        private class LatestReleaseInfo
        {
            public string tag_name;
        }

アプリケーション側のversionの取得は以下で行います。

// アプリケーションの現在のバージョンを取得
string currentVersion = Application.version.TrimStart('v', 'V');

取得した最新のverとアプリケーション側のverの比較は System.Version.Version.CompareToで行います。

    /// <summary>
    /// バージョン文字列を比較して、最新バージョンが現在のバージョンより新しいかを判定します
    /// </summary>
    private bool IsNewerVersion(string latestVersion, string currentVersion)
    {
        try
        {
            var latest = new Version(latestVersion);
            var current = new Version(currentVersion);

            return latest.CompareTo(current) > 0;
        }
        catch (Exception ex)
        {
            Log.Error($"バージョン比較のエラー: {ex.Message}");
            return false;
        }
    }
MidraLab(ミドラボ)

Discussion