Получить версию приложения Bundle в Unity3d - программирование
Подтвердить что ты не робот

Получить версию приложения Bundle в Unity3d

Простой вопрос, но его очень сложно найти.

Я создаю Android и iOS. И я хочу извлечь версию (например, "2.0.1" ) приложения (чтобы отобразить всплывающее окно, если в App Store/Google Play есть более новая версия).

Кто-нибудь знает, как это сделать программно?

4b9b3361

Ответ 1

UnityEngine.Application.version является статическим членом, который, похоже, является эквивалентом среды UnityEditor.PlayerSettings.bundleVersion.

Ответ 2

OUTDATED:. Хотя этот ответ был совершенно верным на момент написания, содержащаяся в нем информация устарела. Существует лучший способ сделать это сейчас, см. этот ответ. Ответ был сохранен по историческим причинам, пожалуйста, подумайте об этом перед голосованием.

ОБНОВЛЕНИЕ:

Я улучшил решение, описанное ниже, и сделал проект с открытым исходным кодом (лицензия MIT), размещенный в github. С первого взгляда он не только обеспечивает доступ к пакетной версии запущенного приложения, но и отслеживает историю предыдущей версии пакета довольно приемлемым способом - по крайней мере, с тех пор, как требуется установка плагина или некоторые ручные настройки.
Итак, посмотрите:

BundleVersionChecker в github
Использование и более подробная информация


Я просто нашел другое и довольно удобное решение. Требуются 2 класса:

Первый - класс редактора, проверяющий текущий 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;
    }
}

Второй класс называется 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) //...

Ответ 3

OUTDATED:. Хотя этот ответ был совершенно верным на момент написания, содержащаяся в нем информация устарела. Существует лучший способ сделать это сейчас, см. этот ответ. Ответ был сохранен по историческим причинам, пожалуйста, подумайте об этом перед голосованием.

Одним словом: Нет. Вы не можете получить версию пакета приложений прямо из Unity.

На самом деле существует функция, называемая PlayerSettings.bundleVersion, которая может читать, какой номер вы установили в настройках проигрывателя, но, к сожалению, это является функцией класса редактора, поэтому вы не можете использовать ее во время выполнения. (Фактически вы можете изменить это число в Xcode, поэтому число, установленное в настройке проигрывателя Unity, может быть неправильным).

Простым способом является запись вашего номера версии в код и обновление номера при каждом отправке и обновлении вашего приложения. Это немного опасно, потому что вы можете забыть сделать это до выпуска. Поэтому вам может понадобиться контрольный список.

Другой способ - написать плагин. Xcode SDK имеет способ получить версию приложения из информационного плейстра. Вы можете просто вернуть это в Unity для своей цели.

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