Вопрос:
Простой вопрос, но его очень сложно найти.
Я создаю Android и iOS. И я хочу извлечь версию (например, “2.0.1” ) приложения (чтобы отобразить всплывающее окно, если в App Store/Google Play есть более новая версия).
Кто-нибудь знает, как это сделать программно?
Лучший ответ:
UnityEngine.Application.version является статическим членом, который, похоже, является эквивалентом среды UnityEditor.PlayerSettings.bundleVersion.
Ответ №1
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) //…
Ответ №2
OUTDATED:. Хотя этот ответ был совершенно верным на момент написания, содержащаяся в нем информация устарела. Существует лучший способ сделать это сейчас, см. этот ответ. Ответ был сохранен по историческим причинам, пожалуйста, подумайте об этом перед голосованием.
Одним словом: Нет. Вы не можете получить версию пакета приложений прямо из Unity.
На самом деле существует функция, называемая PlayerSettings.bundleVersion, которая может читать, какой номер вы установили в настройках проигрывателя, но, к сожалению, это является функцией класса редактора, поэтому вы не можете использовать ее во время выполнения. (Фактически вы можете изменить это число в Xcode, поэтому число, установленное в настройке проигрывателя Unity, может быть неправильным).
Простым способом является запись вашего номера версии в код и обновление номера при каждом отправке и обновлении вашего приложения. Это немного опасно, потому что вы можете забыть сделать это до выпуска. Поэтому вам может понадобиться контрольный список.
Другой способ – написать плагин. Xcode SDK имеет способ получить версию приложения из информационного плейстра. Вы можете просто вернуть это в Unity для своей цели.
[[[NSBundle mainBundle] infoDictionary] objectForKey:@»CFBundleVersion»]