2013-06-20 3 views
14

Простой вопрос, но кажется очень трудно найти.Получить версию приложения Bundle в Unity3d

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

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

+0

Комплект, на котором он расположен: на вашем собственном сервере или размещен контент для покупок в приложении? В чем ответственность за комплект? Реальные активы или просто информация о версии для запуска обновления приложения? – Kay

+0

Посмотрите на мой udpated ответ ниже, если вам все еще нравится иметь решение для получения версии пакета. – Kay

+0

Я уже выпустил игру, но посмотрю на нее для будущих проектов! Благодаря! – Sunkas

ответ

5

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

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

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

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

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

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

+0

Я немного смущен, я использовал PlayerSettings.bundleVersion просто отлично во время выполнения ... – GONeale

15

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

ОБНОВЛЕНИЕ:

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

BundleVersionChecker at github
Usage and more details


Я просто нашел другую и очень удобное решение. Требуются 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; 
    } 
} 

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) //...

+0

Отлично работает. Благодаря! –

+0

После обновления Unity до 5.3.2f1 и MonoDevelop до 5.9.6 он перестает работать. Теперь я получаю ошибку сборки в BundleVersionChecker.cs: В текущем контексте имя CurrentBundleVersion не существует. Что-то изменилось в Unity относительно экспозиции символов между редакторами и игровыми классами? Я попытался добавить [InitializeOnLoad] (в пространстве имен UnityEditor) до определения класса CurrentBundleVersion, но это не помогло :( –

+0

OK Мне удалось обойти ошибку сборки, не проверяя изменение версии в конструкторе BundleVersionChecker() и просто всегда вызывается непосредственно CreateNewBuildVersionClassFile (PlayerSettings.bundleVersion). Я не вижу ужасного влияния на производительность, поскольку он просто вызывается каждый раз, когда окно редактора Unity получает фокус. –

Смежные вопросы