web-dev-qa-db-ja.com

Unity3dでApp Bundleバージョンを取得する

簡単な質問ですが、見つけるのは非常に難しいようです。

AndroidおよびiOSゲームです。アプリのバージョン(「2.0.1」)を抽出します(App Storeに新しいバージョンがある場合にポップアップを表示するため) /グーグルプレイ)。

誰でもこれをプログラムで行う方法を知っていますか?

16
Sunkas

nityEngine.Application.version は、UnityEditor.PlayerSettings.bundleVersionに相当するランタイムと思われる静的メンバーです。

11
2manyprojects

OUTDATED:この回答は執筆時点では完全に有効でしたが、そこに含まれる情報は古くなっています。これを行うより良い方法があります。代わりに this answer を参照してください。答えは歴史的な理由で保存されています。

更新

以下で説明するソリューションを大幅に改善し、githubでホストされるオープンソースプロジェクト(MITライセンス)を作成しました。一目で、現在実行中のアプリのバンドルバージョンへのアクセスを提供するだけでなく、かなり便利な方法で以前のバンドルバージョンの履歴も追跡します-少なくともプラグインのインストールまたはいくつかの手動調整が必要であるためです。
以下を見てください:

githubのバンドルバージョンチェッカー
使用法と詳細


私は別のかなり便利な解決策を見つけました。 2つのクラスが必要です。

1つ目は、現在の_PlayerSettings.bundleVersion_をチェックするエディタークラスです。私はそれをBundleVersionCheckerと呼び、Assets/Editorに配置する必要があります。バンドルバージョンが変更された場合、バージョンストリングのみを含む非常に単純な静的クラスを生成するコードジェネレーターとして機能します。

_using UnityEngine;
using UnityEditor;
using System.IO;

[InitializeOnLoad]
public class BundleVersionChecker
{
    /// <summary>
    /// Class name to use when referencing from code.
    /// </summary>
    const string ClassName = "CurrentBundleVersion";

    const string TargetCodeFile = "Assets/Scripts/Config/" + ClassName + ".cs";

    static BundleVersionChecker () {
        string bundleVersion = PlayerSettings.bundleVersion;
        string lastVersion = CurrentBundleVersion.version;
        if (lastVersion != bundleVersion) {
            Debug.Log ("Found new bundle version " + bundleVersion + " replacing code from previous version " + lastVersion +" in file \"" + TargetCodeFile + "\"");
            CreateNewBuildVersionClassFile (bundleVersion);
        }
    }

    static string CreateNewBuildVersionClassFile (string bundleVersion) {
        using (StreamWriter writer = new StreamWriter (TargetCodeFile, false)) {
            try {
                string code = GenerateCode (bundleVersion);
                writer.WriteLine ("{0}", code);
            } catch (System.Exception ex) {
                string msg = " threw:\n" + ex.ToString ();
                Debug.LogError (msg);
                EditorUtility.DisplayDialog ("Error when trying to regenerate class", msg, "OK");
            }
        }
        return TargetCodeFile;
    }

    /// <summary>
    /// Regenerates (and replaces) the code for ClassName with new bundle version id.
    /// </summary>
    /// <returns>
    /// Code to write to file.
    /// </returns>
    /// <param name='bundleVersion'>
    /// New bundle version.
    /// </param>
    static string GenerateCode (string bundleVersion) {
        string code = "public static class " + ClassName + "\n{\n";
        code += System.String.Format ("\tpublic static readonly string version = \"{0}\";", bundleVersion);
        code += "\n}\n";
        return code;
    }
}
_

2番目のクラスはCurrentBundleVersionと呼ばれます。これはBundleVersionCheckerによって生成された上記の単純なクラスであり、コードからアクセスできます。バージョン文字列がBundleVersionCheckerにあるものと一致しない場合は、PlayerSettingsによって自動的に再生成されます。

_public static class CurrentBundleVersion
{
    public static readonly string version = "0.8.5";
}
_

生成されたコードなので、気にする必要はありません。バージョン管理システムにコミットするだけです。

したがって、コード内のどこにでも記述できます。

_if (CurrentBundleVersion != "0.8.4") {
    // do migration stuff
}
_

私は現在、より洗練されたバージョンに取り組んでいます。これには、次のようなことを行うためのいくつかのバージョン追跡が含まれます

if (CurrentBundleVersion.OlderThan (CurrentBundleVersion.Version_0_8_5) //...

17
Kay

OUTDATED:この回答は執筆時点では完全に有効でしたが、そこに含まれる情報は古くなっています。これを行うより良い方法があります。代わりに this answer を参照してください。歴史的な理由で答えは保持されています。投票する前にこれを検討してください。

つまり、Unityから直接App Bundleバージョンを取得することはできません。

実際、プレーヤー設定で設定した数値を読み取ることができる PlayerSettings.bundleVersion という関数がありますが、残念ながらそれはエディタークラス関数であるため、ランタイムでは使用できません。 (実際、この番号はXcodeで変更できるため、Unityのプレーヤー設定で設定された番号は間違っている可能性があります)。

簡単な方法は、コードにバージョン番号を記述し、アプリを送信して更新するたびに番号を更新することです。リリース前に忘れることがあるので少し危険です。そのため、チェックリストが必要になる場合があります。

別の方法はプラグインを書くことです。 Xcode SDKには、info plistからアプリのバージョンを取得するメソッドがあります。目的に応じて、これをUnityに戻すことができます。

[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]

7
onevcat