在Unity3d中获取App Bundle版本

时间:2013-06-20 07:58:50

标签: c# unity3d

简单的问题,但似乎很难找到。

我正在构建Android和iOS游戏。我想提取应用程序的版本(即“2.0.1”)(如果App Store / Google Play上有更新的版本,则显示弹出窗口)。

任何人都知道如何以编程方式执行此操作?

3 个答案:

答案 0 :(得分:16)

  

OUTDATED:虽然此答案在撰写时完全有效,但其中包含的信息已过时。现在有更好的方法,请参阅this answer。由于历史原因,答案已经保留,请在投票前考虑这个问题。

更新:

我大量改进了下面描述的解决方案,并在github上托管了一个开源项目(MIT许可证)。一目了然,它不仅可以访问当前运行的应用程序的捆绑版本,还可以非常方便地跟踪以前捆绑版本的历史记录 - 至少需要安装插件或进行一些手动调整。
所以看看:

BundleVersionChecker at github
Usage and more details


我刚刚找到了另一个非常方便的解决方案。需要2个课程:

第一个是检查当前PlayerSettings.bundleVersion的编辑器类。我称之为BundleVersionChecker,它必须放在资产/编辑器中。它作为一个代码生成器,只是生成一个非常简单的静态类,只包含一个版本字符串,如果bundle版本已经改变:

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

第二节叫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) //...

答案 1 :(得分:9)

UnityEngine.Application.version是一个静态成员,似乎是UnityEditor.PlayerSettings.bundleVersion的运行时等价物。

答案 2 :(得分:6)

  

OUTDATED:虽然此答案在撰写时完全有效,但其中包含的信息已过时。现在有更好的方法,请参阅this answer。由于历史原因,答案已经保留,请在投票前考虑这个问题。

简而言之:不。您无法直接从Unity获取应用包版本。

实际上,有一个名为PlayerSettings.bundleVersion的函数可以读取您在播放器设置中设置的数字,但遗憾的是它是一个编辑器类函数,因此您无法在运行时使用它。 (实际上你可以在Xcode中更改这个数字,所以在Unity的播放器设置中设置的数字可能是错误的。)

一种简单的方法是在代码中编写版本号,并在每次提交和更新应用时更新号码。这有点危险,因为你可能会在发布之前忘记这样做。所以你可能需要一份清单。

另一种方法是编写插件。 Xcode SDK有一种从info plist获取应用程序版本的方法。你可以把它归还给Unity。

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