web-dev-qa-db-fra.com

Obtenir la version du bundle d'applications dans Unity3d

Question simple, mais semble très difficile à trouver.

Je crée un Android et jeu iOS. Et je veux extraire la version (c.-à-d. "2.0.1") de l'application (pour afficher une fenêtre contextuelle s'il existe une version plus récente sur l'App Store) /Jeu de Google).

Quelqu'un sait comment faire cela par programme?

16
Sunkas

nityEngine.Application.version est un membre statique qui semble être l'équivalent d'exécution de UnityEditor.PlayerSettings.bundleVersion.

11
2manyprojects

MISE À JOUR: Bien que cette réponse était parfaitement valable au moment de la rédaction, les informations qu'elle contient sont obsolètes. Il y a une meilleure façon de le faire maintenant, voir cette réponse à la place. La réponse a été conservée pour des raisons historiques.

Mettre à jour

J'ai amélioré massivement la solution décrite ci-dessous et en ai fait un projet open source (licence MIT) hébergé sur github. En un coup d'œil, il permet non seulement d'accéder à la version de bundle de l'application en cours d'exécution, mais également de suivre l'historique de la version de bundle précédente de manière assez pratique - au moins depuis l'installation du plugin ou certains ajustements manuels sont nécessaires.
Regardez donc:

BundleVersionChecker sur github
tilisation et plus de détails


Je viens de trouver une autre solution assez pratique. 2 cours sont nécessaires:

La première est une classe d'éditeur vérifiant le PlayerSettings.bundleVersion Actuel. Je l'ai appelé BundleVersionChecker et il doit être placé dans Assets/Editor. Il fonctionne comme un générateur de code qui génère simplement une classe statique très simple contenant uniquement une chaîne de version, si la version du bundle a changé:

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

La 2e classe s'appelle CurrentBundleVersion. C'est la classe simple mentionnée ci-dessus générée par BundleVersionChecker et elle est accessible à partir de votre code. Il sera régénéré par BundleVersionChecker automatiquement chaque fois que sa chaîne de version n'est pas égale à celle trouvée dans PlayerSettings.

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

Parce qu'il s'agit d'un code généré, vous n'avez pas à vous en soucier, il suffit de le valider dans votre système de contrôle de version.

Donc, n'importe où dans votre code, vous pouvez simplement écrire:

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

Je travaille actuellement sur une version plus sophistiquée. Cela contiendra un suivi de version pour faire quelque chose comme

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

17
Kay

MISE À JOUR: Bien que cette réponse était parfaitement valable au moment de la rédaction, les informations qu'elle contient sont obsolètes. Il y a une meilleure façon de le faire maintenant, voir cette réponse à la place. La réponse a été conservée pour des raisons historiques, veuillez en tenir compte avant de voter à la baisse.

En un mot: Non. Vous ne pouvez pas obtenir la version du bundle d'application directement depuis Unity.

En fait, il existe une fonction appelée PlayerSettings.bundleVersion qui peut lire le nombre que vous avez défini dans les paramètres du lecteur, mais malheureusement, il s'agit d'une fonction de classe d'édition, vous ne pouvez donc pas l'utiliser en runtime. (En fait, vous pouvez modifier ce numéro dans Xcode, de sorte que le numéro défini dans les paramètres du lecteur Unity peut être incorrect).

Un moyen simple consiste à écrire votre numéro de version dans le code et à le mettre à jour chaque fois que vous soumettez et mettez à jour votre application. C'est un peu dangereux car vous pourriez oublier de le faire avant la sortie. Vous aurez donc peut-être besoin d'une liste de contrôle.

Une autre façon est d'écrire un plugin. Xcode SDK a une méthode pour obtenir la version de l'application à partir de la liste d'informations. Vous pouvez simplement le renvoyer à Unity pour votre objectif.

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

7
onevcat