CFBundleVersion और CFBundleShortVersionString के लिए मुझे किन मूल्यों का उपयोग करना चाहिए?


98

यह मेरा पहला आईओएस ऐप सबमिशन है और मैं नहीं चाहता कि मेरा ऐप रिजेक्ट हो जाए।

यह Apple डॉक्स से है:

CFBundleVersion (स्ट्रिंग - आईओएस, ओएस एक्स) बंडल के बिल्ड संस्करण संख्या को निर्दिष्ट करता है, जो बंडल के एक पुनरावृत्ति (जारी या अप्रबंधित) की पहचान करता है। बिल्ड संस्करण संख्या में एक स्ट्रिंग होनी चाहिए जिसमें तीन गैर-ऋणात्मक, अवधि-पूर्ण पूर्णांक पूर्णांक पूर्णांक शून्य से अधिक हो। स्ट्रिंग में केवल संख्यात्मक (0-9) और अवधि (।) अक्षर होने चाहिए। अग्रणी शून्य को प्रत्येक पूर्णांक से काट दिया जाता है और इसे अनदेखा किया जाएगा (अर्थात 1.02.3 1.2.3 के बराबर है)। यह कुंजी स्थानीय नहीं है।

CFBundleShortVersionString (स्ट्रिंग - iOS, OS X) बंडल की रिलीज़ संस्करण संख्या को निर्दिष्ट करता है, जो ऐप के रिलीज़ किए गए पुनरावृत्ति की पहचान करता है। रिलीज़ संस्करण संख्या एक स्ट्रिंग है जिसमें तीन अवधि-पृथक पूर्णांक शामिल हैं। पहला पूर्णांक ऐप में प्रमुख संशोधनों का प्रतिनिधित्व करता है, जैसे कि संशोधन जो नई सुविधाओं या प्रमुख परिवर्तनों को लागू करते हैं। दूसरा पूर्णांक उन संशोधनों को दर्शाता है जो कम प्रमुख विशेषताओं को लागू करती हैं। तीसरा पूर्णांक रखरखाव रिलीज का प्रतिनिधित्व करता है।

इस कुंजी का मान "CFBundleVersion" के मूल्य से भिन्न होता है, जो ऐप के एक पुनरावृत्ति (जारी या अप्रकाशित) की पहचान करता है। इस कुंजी को आपकी InfoPlist.strings फ़ाइलों में शामिल करके स्थानीयकृत किया जा सकता है।

लेकिन यह थोड़ा अजीब लगता है। इसके लिए मेरी व्याख्या दोनों मूल्यों को एक समान रखना है, अर्थात:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

क्या कोई 100% पुष्टि कर सकता है कि मुझे क्या करना चाहिए?


1
उस के अनुसार, CFBundleShortVersionString को स्थानीयकृत किया जा सकता है। लेकिन अगर इसे तीन पूर्णांकों से अलग किया जाना है, तो क्या स्थानीयकरण संभव है?
रिक

@ मुझे लगता है कि इसका मतलब है कि आप इसे उन भाषाओं के लिए परिवर्तित कर सकते हैं जिनके वास्तव में अरबी जैसे अलग-अलग अंक हैं?

@शिज़र बस पांडित्यपूर्ण होने के लिए, "अरबी अंक" वास्तव में वे अंक हैं जो हम पश्चिमी दुनिया में उपयोग करते हैं, और अधिकांश स्थानों पर भी। लेकिन मुझे वही मिलता है जो आपका मतलब है, और अरबी दुनिया के कुछ हिस्से हैं जो "अरबी अंकों" का उपयोग नहीं करते हैं। en.wikipedia.org/wiki/Arabic_numeral
RenniePet

1
यहां एक और जवाब। stackoverflow.com/q/21125159/419348
AechoLiu

जवाबों:


77

इसे इस तरह से सोचें: "लघु संस्करण" ( CFBundleShortVersionString) सार्वजनिक संस्करण संख्या है। "संस्करण" ( CFBundleVersion) एक आंतरिक संस्करण संख्या है जो सार्वजनिक "लघु संस्करण" की तुलना में कहीं अधिक बार बदल सकता है। व्यक्तिगत रूप से मैं दोनों के लिए समान उपयोग करता हूं लेकिन बहुत से लोग हर बिल्ड पर "संस्करण" को अपडेट करते हैं। किसी भी तरह से आप आम तौर पर "लघु संस्करण" को अपडेट करते हैं जब आप Apple को रिलीज़ करते हैं। आप कितनी बार "संस्करण" अपडेट करते हैं, यह आपकी और आपकी जरूरतों पर निर्भर करता है।


14
ध्यान रखें कि बंडल संस्करण (CFBundleVersion) को अपने पिछले ऐप के बंडल संस्करण को संख्यात्मक रूप से पार करना होगा या ऐप स्टोर में सबमिट करते समय यह एक त्रुटि प्राप्त करेगा। Stackoverflow.com/questions/4933093/… देखें ।
फिल

3
क्या फिल ऊपर कहते हैं, आजकल, यदि आप की ही तरह फिर से जमा एक असफल (App स्टोर द्वारा अनुमोदित नहीं) का निर्माण, यह है कि आप अब प्रत्येक प्रस्तुत करने पर CFBundleVersion टक्कर की जरूरत है लग रहा है , इसलिए संभावना इन नंबरों वितरित हो जाते हैं जब तक आप हमेशा सही कर रहे हैं, या आप अपने सार्वजनिक (CFBundleShortVersionString) संस्करण को ऐप स्टोर में सफल प्रस्तुत करने के लिए आवश्यक किसी भी परिवर्तन पर टकराने से बुरा नहीं मानते।
इसी तरह

106

CFBundleShortVersionString आपको अपने ऐप का संस्करण देता है । जब भी आप अपने ऐप को ऐप स्टोर पर प्रकाशित करते हैं, तो यह आम तौर पर बढ़ जाता है। यह वह संस्करण है जो आपके एप्लिकेशन के ऐप स्टोर पेज के लिए "संस्करण" अनुभाग पर दिखाई देता है।

CFBundleVersion आपको बिल्ड नंबर देता है जिसका उपयोग विकास और परीक्षण के लिए किया जाता है, जिसका अर्थ है "तकनीकी" उद्देश्य। अंतिम उपयोगकर्ता को बिल्ड नंबर में शायद ही कोई दिलचस्पी है लेकिन विकास के दौरान आपको यह जानना होगा कि प्रत्येक बिल्ड पर क्या विकसित और तय किया जा रहा है। यह आम तौर पर आंतरिक रिलीज के प्रत्येक पुनरावृत्ति पर बढ़ाया जाता है। और आप प्रत्येक बिल्ड पर बिल्ड नंबर को ऑटो-इंक्रीमेंट करने के लिए जेनकींस जैसे निरंतर एकीकरण उपकरण का उपयोग कर सकते हैं।

वर्जन और बिल्ड नंबर

दो नंबर एक दूसरे पर निर्भर नहीं करते हैं लेकिन भ्रम से बचने के लिए उन्हें समानांतर रखना एक अच्छा विचार है। ध्यान रखें कि एक बार जब आपका ऐप ऐप स्टोर की समीक्षा कर चुका होता है, तो आपको फिल की तरह बिल्ड नंबर को बढ़ाने की आवश्यकता होती है और जैसा कि आप ने प्रकाशित किया है या नहीं, इस पर ध्यान दिए बिना।

मामले का उपयोग करें: मान लें कि, आपके पास एक अच्छी तरह से जांची हुई इमारत है, जो प्रस्तुत करने के लिए तैयार है। इसका वर्जन नंबर 1.0.0 है और बिल्ड नंबर 1.0.0.32 है । एक बार जब आप अपना ऐप सबमिट कर देते हैं, तो आपको संस्करण को 1.0.1 के रूप में अपडेट करना होगा और नंबर को 1.0.1.0 के रूप में बनाना होगा ।


4
इसलिए, क्या सीफ़बंडलेवर्जन के " तीन " अवधि-अलग-अलग मूल्यों के बारे में डॉक्स (प्रश्न में उद्धृत) में उस बिट को अनदेखा करना सुरक्षित है ?
18_ 18

मुझे लगता है कि यह आप पर निर्भर है। यदि आप बार-बार रिलीज़ प्रकाशित नहीं करते हैं या यदि आपको लगातार परीक्षण चक्रों के माध्यम से बग फिक्स का सख्ती से पालन करने की आवश्यकता नहीं है; आप दोनों के लिए 3 अंकों का उपयोग कर सकते हैं।
यूनुस नेदिम मेहेल

तो क्या ऐप स्टोर बनाने के लिए CFBundleVersion 0 हो सकता है? क्या Apple इसे खारिज करेगा?
११:१४ बजे

3
हां, आप विराम चिह्न के साथ 3 संख्याओं के अलावा अन्य मानों का उपयोग कर सकते हैं। मैंने 201606070620एक शिपिंग आईओएस ऐप जैसे डेट-टाइम मान का उपयोग किया है ।
तुलसी बॉर्क

3
@BasilBourque, यदि आप दिशानिर्देशों का पालन नहीं करते हैं, तो आप इन-ऐप खरीदारी का उपयोग करने पर समस्या में भाग सकते हैं। तकनीकी नोट 2413
डैनस्किल

16

Rmaddy द्वारा जवाब सही है। मैं दो और विचार जोड़ूंगा।

तीसरा संस्करण संख्या

अपने ऐप की परिभाषा के भाग के रूप में iTunesConnect वेब साइट पर निर्दिष्ट तीसरे संस्करण की संख्या से अवगत रहें। अगर वह संख्या Xcode में दोनों से अलग है, तो Apple आपको एक चेतावनी देता है। आप चेतावनी को अनदेखा कर सकते हैं, क्योंकि यह शो-स्टॉपर ("त्रुटि" नहीं) है।

दिनांक-समय संस्करण के रूप में

इसके अलावा, आपको विराम चिह्न के साथ तीन नंबरों का उपयोग करने की आवश्यकता नहीं है। कुछ ऐप्स के लिए यह समझ में आ सकता है, जहां पारंपरिक रूप से पहले नंबर में बदलाव से कुछ प्रकार के नाटकीय परिवर्तन का संकेत मिलता है जो आमतौर पर संगतता को प्रभावित करते हैं।

अन्य ऐप्स के लिए आप आईएसओ 8601 मानक प्रारूप शैली (YYYMMDDHHMM) में केवल दिनांक-समय मान का उपयोग करना चाह सकते हैं । उदाहरण के लिए, 201606070620। वर्ष-महीने-तारीख-घंटे-मिनट का वह क्रम एक बढ़ती हुई संख्या को प्रदान करता है, हमेशा एक ही लंबाई गद्दी शून्य के कारण होता है, कि जब वर्णानुक्रम में क्रमबद्ध रूप से भी कालानुक्रमिक होता है।

मैंने iOS 7, 8, और 9 में काम कर रहे शिपिंग ऐप पर संस्करण संख्याओं की इस शैली का सफलतापूर्वक उपयोग किया है।

तुम भी इस मूल्य की पीढ़ी को स्वचालित कर सकते हैं। अपनी परियोजना के दशक में Target> Build Phases> Run Scriptपैनल:

  1. Shellक्षेत्र में निर्दिष्ट करें :/bin/sh
  2. नीचे देखी गई 5 लाइन स्क्रिप्ट को पेस्ट करें।
  3. (वैकल्पिक) Show environment variables in build logचेकबॉक्स की जाँच करें ।
  4. Run script only when installingचेकबॉक्स को अनचेक करें ।

जब भी आप UTC टाइम ज़ोन में वर्तमान दिनांक-समय बनाते हैं, कैप्चर किया जाता है। -uलिपि में झंडा नहीं बल्कि अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र से यूटीसी का उपयोग करता है। आम तौर पर प्रोग्रामर और sysadmins के लिए सबसे अच्छा और स्थानीय समय क्षेत्र के बजाय UTC में उपयोग करने और सोचने के लिए।

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

या 1.2.3संस्करण संख्या के लिए एक पारंपरिक और बिल्ड संख्या के रूप में एक तिथि-समय के साथ एक हाइब्रिड करें । हाइब्रिड करने के लिए, केवल CFBundleShortVersionStringएक #सामने की रेखा के साथ टिप्पणी करें ।


8

मेरे लिए सबसे समझदार योजना CFBundleShortVersionStringवास्तविक संस्करण संख्या के लिए संस्करण संख्या (यानी। ) का उपयोग करना है, और फिर CFBundleVersionऐप स्टोर में प्रस्तुत करने के लिए बिल्ड नंबर (यानी। ) का उपयोग करना है । इसलिए जब तक कोई समस्या नहीं होती है और इसलिए फिर से जमा हो जाता है, यह संख्या हमेशा 1. होती है एक नई रिलीज के लिए, मैं 1 पर रीसेट करता हूं अगर पिछले में टेस्टफलाइट परीक्षण या समीक्षा में समस्या थी।

बिल्ड संख्याएँ किसी विशेष रिलीज़ के लिए आपके द्वारा प्रस्तुत सबमिशन के नाम का एक तरीका प्रदान करती हैं। जैसा कि ऊपर की परिभाषाओं में वर्णित है, आपके द्वारा अपने ऐप के किसी विशेष संस्करण के लिए प्रदान किए जाने वाले सभी बिल्ड का संग्रह उस संस्करण की 'रिलीज़ ट्रेन' कहलाता है। IOS ऐप्स के लिए, बिल्ड नंबर प्रत्येक रिलीज़ ट्रेन के भीतर अद्वितीय होने चाहिए, लेकिन उन्हें अलग-अलग रिलीज़ ट्रेनों [मेरे जोर] पर अद्वितीय होने की आवश्यकता नहीं है । कहने का तात्पर्य यह है कि iOS एप्स के लिए आप एक ही बिल्ड नंबरों का इस्तेमाल अलग-अलग रिलीज ट्रेनों में फिर से कर सकते हैं अगर आप करना चाहते हैं

से संस्करण संख्याओं और नंबर बिल्ड: तकनीकी नोट TN2420


1
इस पृष्ठ पर अन्य उत्तरों में प्रस्तुत व्याख्याओं की पुष्टि करने वाला एक आधिकारिक संदर्भ प्रदान करने वाले उत्तर को देखने के लिए अच्छा है।
user2067021

6

मैं का उपयोग CFBundleVersion के लिए आंतरिक बिल्ड इंगित करने के लिए CFBundleShortVersionString । मैं अपने परीक्षकों के लिए बिल्ड प्रस्तुत करने के लिए परीक्षण उड़ान का उपयोग करता हूं इसलिए उनके बीच का अंतर अत्यंत उपयोगी रहा है।

Apple दस्तावेज़ों का कहना है कि CFBundleVersion "एक स्ट्रिंग होना चाहिए जिसमें 3 गैर-नकारात्मक, अवधि-पृथक पूर्णांक शामिल हों" लेकिन वास्तव में यह 3 भागों से अधिक हो सकता है (जैसा कि उपरोक्त उत्तर दिखाता है)। मैं अपने विकास बिल्ड को इंगित करने के लिए उपयोग करता हूं, मेरे CFBundleShortVersionString का कहना है कि मैं 1.0.0 है, मैं CFBundleVersion के लिए 1.0.0.11 का उपयोग कर सकता हूं, यह इंगित करने के लिए कि रिलीज के लिए मेरा 11 वां निर्माण है 1.0.0

ऐप स्टोर में जमा किया गया प्रत्येक CFBundleVersion पहले की तुलना में बड़ा होना चाहिए या आपको ERROR ITMS-90478 : "अमान्य संस्करण" मिल जाएगा । "xxx" संस्करण के साथ निर्माण को आयात नहीं किया जा सकता है क्योंकि बाद के संस्करण को नए बिल्ड कमिशन के लिए बंद कर दिया गया है। एक अलग संस्करण संख्या। "

CFBundleShortVersionString के केवल 3 भाग हो सकते हैं या आपको ERROR ITMS-90060 मिलेगा: Info.plist फ़ाइल में कुंजी CFBundleShortVersionString 'xxx' का मान अधिकतम तीन गैर-नकारात्मक पूर्णांकों की अवधि-पृथक सूची होनी चाहिए । "

तुलसी बॉर्क ने जिस 3 नंबर का उल्लेख किया है, वह आईट्यून्सकनेक्ट पर संस्करण संख्या दिखाता है, जहां चीजें जटिल हो सकती हैं।

मैं CFBundleShortVersionString की तुलना में एक अलग iTunesConnect नंबर का उपयोग करता हूं क्योंकि जब मैंने पहली बार ऐप स्टोर में अपना ऐप सबमिट किया था तो हमारे पास पहले से ही आंतरिक रिलीज़ के कई दौर हैं। इसलिए मैंने iTunesConnect नंबर के लिए 1.0 और CFBundleShortVersionString के लिए 5.x का उपयोग किया। ऐप स्टोर में अगली रिलीज़ में मैंने यह जांचने के लिए एक फ़ंक्शन प्रदान किया कि क्या ऐप स्टोर में एक नया संस्करण है और मुझे एहसास हुआ कि मुझे अब परेशानी हुई क्योंकि मैं केवल iTunesConnect नंबर (उपयोग करके http://itunes.apple.com/lookup?bundleId=) प्राप्त कर सकता हूं इसलिए मुझे तुलना करने से पहले कुछ गणना करने की आवश्यकता है CFBundleShortVersionString नंबर के साथ।

मैंने अपने CFBundleShortVersionString के रूप में iTunesConnect नंबर का उपयोग करके इसे ठीक करने की कोशिश की, लेकिन त्रुटि मिली, ERROR ITMS-90062 : "यह बंडल अमान्य है। Info.plist फ़ाइल में कुंजी CFBundleSortVersionString [xxx] के लिए मान की तुलना में एक उच्च संस्करण होना चाहिए। पहले से स्वीकृत संस्करण [xxx] के लिए। "

इसलिए मैं सुझाव दूंगा कि वे हमेशा ऐसा ही बनाएं।


5

मैंने कभी भी कहीं भी चर्चा में नहीं देखा कि CFBundleVersion में प्रत्येक क्षेत्र के लिए अधिकतम संख्या क्या है?

1.1.1 में एक ऐप में CFBundleVersion सेट करके और "lsregister -dump" में संस्करण के लिए हेक्साडेसिमल वाएयू को देखते हुए, मैंने निर्धारित किया कि पहले फ़ील्ड के लिए अधिकतम मान है (2 ^ 22 + -1 / 4194303, और अधिकतम दूसरे और तीसरे क्षेत्र के लिए मान हैं (2 ^ 21) -1 या 2097151।

3 फ़ील्ड 64 बिट तक जुड़ते हैं।

यह हम में से उन लोगों के लिए निहितार्थ है जो तारीख और समय के आधार पर CFBundleVersion का उपयोग करते हैं।

मैं YYYYMMDD के लिए पहला फ़ील्ड सेट कर रहा था। यह हमेशा अधिकतम अनुमत संस्करणों की तुलना में अधिक है और यह अप्रत्याशित परिणामों के लिए अग्रणी था, कम से कम कहने के लिए, जब लॉन्च सेवा यह निर्णय ले रही थी कि ऐप के कौन से संस्करण को चलाने के लिए जब आपके पास कई संस्करण स्थापित थे और कुछ का उपयोग कर रहे थे जैसे 'ओपन-ए ऐपनाम' 'कमांड लाइन से।

कृपया इसे व्यापक रूप से फैलाएं। मुझे यकीन है कि बहुत से लोग इस से अस्थिर हो रहे हैं।


क्या आपको याद है कि यदि एक चौथा क्षेत्र जोड़ा जाता है तो क्या किया जाता है (1.1.1.20191201) और इसके बजाय आप क्या उपयोग करते हैं? मैं वास्तव में कामना करता हूं कि Apple ने केवल उसी संख्यात्मक मूल्य का उपयोग किया है जो एंड्रॉइड ने यहां किया था। पुनश्च यह देखने के लिए धन्यवाद!
स्पेससूटिवर

मेरा मानना ​​है कि प्रतिबंध यहाँ प्रलेखित है और यहाँ वर्णित की तुलना में काफी अधिक प्रतिबंधात्मक है।
सागरजहा

3

अब तक, राज्यों के लिए Apple प्रलेखनCFBundleVersion [जोर मेरा]:

बिल्ड संस्करण जो बंडल की एक पुनरावृत्ति की पहचान करता है।

...

यह कुंजी एक मशीन-पठनीय स्ट्रिंग है जो एक से तीन अवधि-अलग-अलग पूर्णांकों से बना है , जैसे कि 10.14.1। स्ट्रिंग में केवल संख्यात्मक वर्ण (0-9) और अवधियाँ हो सकती हैं।

...

आप अधिक पूर्णांक शामिल कर सकते हैं लेकिन सिस्टम उन्हें अनदेखा करता है।

के लिये CFBundleShortVersionString [जोर मेरा]:

बंडल की रिलीज़ या संस्करण संख्या।

...

यह कुंजी बंडल के संस्करण के लिए एक उपयोगकर्ता-दृश्यमान स्ट्रिंग है। आवश्यक प्रारूप तीन अवधि-पृथक पूर्णांक है , जैसे कि 10.14.1। स्ट्रिंग में केवल संख्यात्मक वर्ण (0-9) और अवधियाँ हो सकती हैं।

मेरा सुझाव है कि बस स्वचालित रूप से वेतन वृद्धि होगी CFBundleVersion प्रत्येक बिल्ड (या टेस्टफ़लाइट के लिए प्रत्येक रिलीज़) के लिए और जब भी आप इसे बदलें, इसे 0 पर रीसेट कर दें CFBundleShortVersionString

उपयोगकर्ता दृश्य संस्करण को अपडेट करने के लिए, आपको स्पष्ट रूप से योजना बनाना चाहिए या एक सुसंगत साधनों को तैयार करना चाहिए CFBundleShortVersionString

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.