2013-06-20 17 views
14

में ऐप बंडल संस्करण प्राप्त करें सरल प्रश्न, लेकिन खोजने में बहुत मुश्किल लगता है।यूनिटी 3 डी

मैं एक एंड्रॉइड और आईओएस गेम बना रहा हूं। और मैं ऐप के संस्करण (यानी "2.0.1") निकालना चाहता हूं (यदि ऐप स्टोर/Google Play पर कोई नया संस्करण है तो पॉपअप प्रदर्शित करने के लिए)।

कोई भी इस प्रोग्रामेटिक तरीके से कैसे करना है?

+0

बंडल, यह कहां स्थित है: अपने सर्वर पर या क्या यह इन-ऐप खरीदारियों की सामग्री होस्ट करता है? बंडल की ज़िम्मेदारी क्या है? ऐप के अपडेट को ट्रिगर करने के लिए रियल एस्टेट या सिर्फ वर्जनिंग जानकारी? – Kay

+0

यदि आप अभी भी बंडल संस्करण प्राप्त करने का समाधान चाहते हैं तो नीचे दिए गए मेरे उत्तर दिए गए उत्तर को देखें। – Kay

+0

मैंने पहले ही गेम जारी कर दिया है, लेकिन भविष्य की परियोजनाओं के लिए इसे देखेंगे! धन्यवाद! – Sunkas

उत्तर

8

UnityEngine.Application.version कुछ करने के लिए पर नज़र रखने के कुछ संस्करण में शामिल होंगे एक स्थिर सदस्य है कि UnityEditor.PlayerSettings.bundleVersion के क्रम बराबर हो रहा है है।

5

पुरानी: हालांकि इस सवाल का जवाब लेखन के समय पूरी तरह से वैध था, इसमें दी गई जानकारी पुरानी हो चुकी है। इसे करने का एक बेहतर तरीका है, इसके बजाय this answer देखें। उत्तर ऐतिहासिक कारणों से संरक्षित किया गया है, कृपया इसे नीचे मतदान से पहले मानें।

एक शब्द में: नहीं। आप एपिटी से सीधे ऐप बंडल संस्करण नहीं प्राप्त कर सकते हैं।

वास्तव में, PlayerSettings.bundleVersion नामक एक फ़ंक्शन है जो प्लेयर सेटिंग में आपके द्वारा सेट की गई संख्या को पढ़ सकता है, लेकिन दुर्भाग्यवश यह एक संपादक वर्ग फ़ंक्शन है ताकि आप इसे रनटाइम में उपयोग करने में सक्षम न हों। (वास्तव में आप इस नंबर को एक्सकोड में बदल सकते हैं, इसलिए यूनिटी की प्लेयर सेटिंग में सेट नंबर गलत हो सकता है)।

कोड में अपना संस्करण नंबर लिखना एक आसान तरीका है, और जब भी आप अपना ऐप सबमिट करते हैं और अपडेट करते हैं तो नंबर अपडेट करें। यह थोड़ा खतरनाक है क्योंकि आप रिलीज से पहले इसे करना भूल सकते हैं। तो आपको इसके लिए एक चेक सूची की आवश्यकता हो सकती है।

एक और तरीका एक प्लगइन लिखना है। एक्सकोड एसडीके के पास ऐप का संस्करण जानकारी प्लिस्ट से प्राप्त करने का एक तरीका है। आप इसे अपने उद्देश्य के लिए एकता में वापस कर सकते हैं।

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

+0

मैं थोड़ी उलझन में हूं, मैंने प्लेयरटाइटिंग्स का उपयोग किया। बंडलवर्सन रनटाइम में ठीक है ... – GONeale

15

पुरानी: हालांकि इस सवाल का जवाब लेखन के समय पूरी तरह से वैध था, इसमें दी गई जानकारी पुरानी हो चुकी है। इसे करने का एक बेहतर तरीका है, इसके बजाय this answer देखें। उत्तर ऐतिहासिक कारणों से संरक्षित किया गया है, कृपया इसे नीचे मतदान से पहले मानें।

अद्यतन:

मैं समाधान बड़े पैमाने पर नीचे वर्णित सुधार हुआ है और एक ओपन सोर्स प्रोजेक्ट (एमआईटी लाइसेंस) बनाया इसे से बाहर GitHub पर की मेजबानी की। एक नज़र में यह न केवल वर्तमान में चल रहे ऐप के बंडल संस्करण तक पहुंच प्रदान करता है बल्कि पिछले बंडल संस्करण के इतिहास को एक सुंदर दृढ़ तरीके से ट्रैक करता है - कम से कम प्लगइन की स्थापना या कुछ मैन्युअल समायोजन की आवश्यकता होती है।
तो देखने में:

BundleVersionChecker at github
Usage and more details


मैं सिर्फ एक और और बहुत सुविधाजनक समाधान मिल गया। 2 कक्षाओं की आवश्यकता है:

पहला वाला एक संपादक वर्ग वर्तमान PlayerSettings.bundleVersion की जांच कर रहा है। मैंने इसे BundleVersionChecker कहा और इसे संपत्ति/संपादक में रखा जाना है।यह एक कोड जनरेटर है कि बस सिर्फ एक संस्करण स्ट्रिंग वाली एक बहुत ही सरल स्थिर वर्ग उत्पन्न करता है के रूप में कार्य करता है, तो बंडल संस्करण बदल चुका है:

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

यूनिटी को 5.3.2 एफ 1 तक अपग्रेड करने के बाद, और मोनो डेवेल 5.9.6 तक, यह काम करना बंद कर दिया। अब मुझे BundleVersionChecker.cs में बिल्ड त्रुटि मिल रही है: वर्तमान संदर्भ में 'CurrentBundleVersion' नाम मौजूद नहीं है। संपादक और गेम कक्षाओं के बीच प्रतीकों के संपर्क के संबंध में एकता में कुछ बदलाव आया? मैंने क्लास CurrentBundleVersion को परिभाषित करने से पहले [InitializeOnLoad] (UnityEditor नेमस्पेस में) जोड़ने की कोशिश की, लेकिन इससे मदद नहीं मिली :( –

+0

ठीक है मैं बंडलवर्सन चेकर() कन्स्ट्रक्टर में संस्करण परिवर्तन की जांच न करके बिल्ड त्रुटि के आसपास काम करने में कामयाब रहा, । और बस हमेशा सीधे बुला CreateNewBuildVersionClassFile (PlayerSettings.bundleVersion) मैं एक भयानक प्रदर्शन प्रभाव के रूप में यह सिर्फ हर कहा जाता है एकता संपादक विंडो ध्यान केंद्रित हो जाता है नहीं दिख रहा है –

संबंधित मुद्दे