संस्करण बनाम एक्सकोड में निर्माण


660

मेरे पास एक ऐप है जिसे मैंने Xcode 3 के साथ विकसित किया है और हाल ही में Xcode 4 के साथ संपादन शुरू किया है। लक्ष्य सारांश में मेरे पास फ़ील्ड के साथ iOS एप्लिकेशन लक्ष्य फ़ॉर्म है: पहचानकर्ता, संस्करण, बिल्ड, डिवाइस और परिनियोजन लक्ष्य। संस्करण फ़ील्ड रिक्त है और बिल्ड फ़ील्ड 3.4.0 है (जो तब से ऐप के संस्करण से मेल खाता है जब मैं अभी भी Xcode 3 के साथ संपादन कर रहा था)।

मेरे प्रश्न हैं:

  1. संस्करण और बिल्ड फ़ील्ड के बीच अंतर क्या है?

  2. Xcode 4 में अपग्रेड करने के बाद संस्करण फ़ील्ड रिक्त क्यों था?


एक बात के लिए, मुझे लगता है कि यह बिल्ड नंबर है जो Xcode ऑर्गनाइज़र अभिलेखागार सूची में दिखाई देता है। इसके अलावा, मुझे यकीन नहीं है कि यह किस लिए उपयोग किया जाता है।
डैनियल डिकिसन

जवाबों:


1224

Apple ने खेतों को फिर से व्यवस्थित / पुनर्निर्मित किया।

आगे बढ़ते हुए, यदि आप अपने अनुप्रयोग लक्ष्य के लिए जानकारी टैब पर देखते हैं, तो आपको अपने बिल्ड के रूप में "बंडल संस्करण स्ट्रिंग, लघु" का उपयोग करना चाहिए (जैसे, 3.4.0) और "बंडल संस्करण" (जैसे, 500 या 1A500) )। यदि आप उन दोनों को नहीं देखते हैं, तो आप उन्हें जोड़ सकते हैं। वे सारांश टैब पर उचित संस्करण का निर्माण करेंगे और टेक्स्टबॉक्स का निर्माण करेंगे; वे समान मूल्य हैं।

जानकारी टैब देखते समय, यदि आप राइट-क्लिक करते हैं और Show Raw Keys / Values ​​का चयन करते हैं , तो आप देखेंगे कि वास्तविक नाम CFBundleShortVersionString(संस्करण) और CFBundleVersion(Build) हैं।

संस्करण का आमतौर पर उपयोग किया जाता है कि आप Xcode 3 के साथ इसका उपयोग कैसे करते हैं। मुझे यकीन नहीं है कि आप किस स्तर पर संस्करण / बिल्ड अंतर के बारे में पूछ रहे हैं, इसलिए मैं इसका उत्तर दार्शनिक रूप से दूंगा।

सभी प्रकार की योजनाएं हैं, लेकिन एक लोकप्रिय है:

{MajorVersion}। {MinorVersion}। {} संशोधन

  • प्रमुख संस्करण - प्रमुख परिवर्तन, नया स्वरूप, और कार्यक्षमता परिवर्तन
  • लघु संस्करण - मामूली सुधार, कार्यक्षमता में परिवर्धन
  • संशोधन - बग-फिक्स के लिए एक पैच नंबर

फिर बिल्ड का उपयोग किसी रिलीज़ के लिए या संपूर्ण उत्पाद जीवनकाल के लिए बिल्ड की कुल संख्या को इंगित करने के लिए अलग से किया जाता है।

कई डेवलपर्स 0 पर बिल्ड नंबर शुरू करते हैं, और हर बार जब वे निर्माण करते हैं तो वे संख्या को एक से बढ़ाते हैं, हमेशा के लिए बढ़ाते हैं। मेरी परियोजनाओं में, मेरे पास एक स्क्रिप्ट है जो मेरे द्वारा निर्मित हर बार स्वचालित रूप से बिल्ड नंबर बढ़ाती है। उस के लिए निर्देश देखें।

  • रिलीज़ 1.0.0 का निर्माण 542 हो सकता है। इसे 1.0.0 रिलीज़ होने में 542 बिल्ड्स लगे।
  • रिलीज 1.0.1 578 का निर्माण हो सकता है।
  • रिलीज 1.1.0 694 का निर्माण हो सकता है।
  • रिलीज 2.0.0 949 का निर्माण हो सकता है।

अन्य डेवलपर्स, जिनमें Apple भी शामिल है, के पास बिल्ड नंबर है जिसमें रिलीज के लिए एक प्रमुख संस्करण + मामूली संस्करण + बिल्ड शामिल हैं। ये वास्तविक सॉफ़्टवेयर संस्करण संख्याएं हैं, जैसा कि विपणन के लिए उपयोग किए जाने वाले मूल्यों के विपरीत है।

यदि आप Xcode मेनू> Xcode के बारे में जाते हैं , तो आपको संस्करण और बिल्ड नंबर दिखाई देंगे। यदि आप अधिक जानकारी ... बटन दबाते हैं, तो आपको विभिन्न संस्करणों का एक गुच्छा दिखाई देगा। चूँकि अधिक जानकारी ... बटन को Xcode 5 में हटा दिया गया था, इसलिए यह जानकारी सिस्टम मेनू ऐप के सॉफ़्टवेयर> डेवलपर अनुभाग से भी उपलब्ध है, जो Apple मेनू> इस बारे में > मैक सिस्टम रिपोर्ट ... को खोलकर उपलब्ध है ।

उदाहरण के लिए, Xcode 4.2 (4C139)। मार्केटिंग संस्करण ४.२ बिल्ड बिल्ड प्रमुख संस्करण ४, बिल्ड मामूली संस्करण सी, और बिल्ड नंबर १३ ९ है। अगली रिलीज़ (संभवत: ४.३) संभवतः रिलीज़ ४ डी का निर्माण होगा, और बिल्ड नंबर ० से शुरू होगा और वहाँ से वेतन वृद्धि होगी।

IPhone सिम्युलेटर संस्करण / बिल्ड नंबर उसी तरह हैं, जैसे कि iPhones, Macs, आदि।

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

अद्यतन करें : अनुरोध के अनुसार, यहां एक स्क्रिप्ट बनाने के लिए चरण हैं जो हर बार चलने वाले बिल्ड नंबर को पढ़ने के लिए आपके एप्लिकेशन को Xcode में बनाते हैं, इसे बढ़ाते हैं, और इसे ऐप की {App}-Info.plistफ़ाइल में वापस लिखते हैं । यदि आप अपना संस्करण लिखना चाहते हैं, तो अतिरिक्त, अतिरिक्त चरण हैं / अपनी Settings.bundle/Root*.plistफ़ाइल के लिए संख्याएँ बनाएँ ।

यह यहाँ कैसे-कैसे लेख से विस्तारित है

Xcode 4.2 में - 5.0:

  1. अपने Xcode प्रोजेक्ट को लोड करें।
  2. बाएं हाथ के फलक में, पदानुक्रम के शीर्ष पर अपनी परियोजना पर क्लिक करें। यह प्रोजेक्ट सेटिंग्स एडिटर को लोड करेगा।
  3. केंद्र विंडो फलक के बाईं ओर, TARGETS शीर्षक के अंतर्गत अपने एप्लिकेशन पर क्लिक करें । आपको प्रत्येक प्रोजेक्ट लक्ष्य के लिए इस सेटअप को कॉन्फ़िगर करने की आवश्यकता होगी।
  4. बिल्ड चरणों का चयन करें टैब।
    • Xcode 4 में, नीचे दाईं ओर, Add Build चरण बटन पर क्लिक करें और Add Script जोड़ें चुनें ।
    • Xcode 5 में, संपादक मेनू> बिल्ड चरण जोड़ें > रन स्क्रिप्ट स्क्रिप्ट चरण जोड़ें का चयन करें ।
  5. कॉपी बंडल संसाधन चरण (जब app-info.plist फ़ाइल आपके ऐप के साथ बंडल हो जाएगी) से ठीक पहले इसे स्थानांतरित करने के लिए नए रन स्क्रिप्ट चरण को खींचें और छोड़ें ।
  6. नए रन स्क्रिप्ट चरण में, शैल सेट करें /bin/bash:।
  7. पूर्णांक बिल्ड संख्याओं के लिए स्क्रिप्ट क्षेत्र में निम्नलिखित को कॉपी और पेस्ट करें:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

    जैसा कि @Bdebeez ने बताया, Apple जेनरिक वर्जन टूल ( agvtool) भी उपलब्ध है। यदि आप इसके बजाय इसका उपयोग करना पसंद करते हैं, तो पहले बदलने के लिए कुछ चीजें हैं:

    • का चयन करें सेटिंग्स बिल्ड टैब।
    • वर्जनिंग सेक्शन के तहत , वर्तमान प्रोजेक्ट संस्करण को उस प्रारंभिक बिल्ड नंबर पर सेट करें जिसका आप उपयोग करना चाहते हैं, जैसे, 1
    • बिल्ड चरण टैब पर वापस , कॉपी बंड संसाधन चरण के बाद अपने रन स्क्रिप्ट चरण को ड्रैग-एंड-ड्रॉप करें और रेस बिल्ड से बचने की कोशिश करें जब दोनों स्रोत बिल्ड को शामिल करने और अपडेट करने की कोशिश करें जिसमें आपका बिल्ड नंबर शामिल हो।

    ध्यान दें कि जिस agvtoolविधि के साथ आप अभी भी समय-समय पर विफल हो सकते हैं / बिना किसी त्रुटि के रद्द हो जाती है। इस कारण से, मैं agvtoolइस स्क्रिप्ट के साथ उपयोग करने की सलाह नहीं देता ।

    फिर भी, अपने रन स्क्रिप्ट चरण में, आप निम्न स्क्रिप्ट का उपयोग कर सकते हैं:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all

    next-versionतर्क में जुड़ जाता बिल्ड नंबर ( bumpभी एक ही बात के लिए एक उपनाम है), और -allअद्यतन Info.plistनए बिल्ड नंबर के साथ।

  8. और अगर आपके पास सेटिंग्स बंडल है जहां आप संस्करण और बिल्ड दिखाते हैं, तो आप संस्करण को अद्यतन करने और बनाने के लिए स्क्रिप्ट के अंत में निम्नलिखित जोड़ सकते हैं। नोट: PreferenceSpecifiersअपनी सेटिंग से मिलान करने के लिए मान बदलें । PreferenceSpecifiers:2इसका मतलब यह है कि PreferenceSpecifiersआपकी प्लिस्ट फ़ाइल में सरणी के नीचे इंडेक्स 2 में आइटम देखें , इसलिए 0-आधारित इंडेक्स के लिए, यह एरे में 3 जी वरीयता सेटिंग है।

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist

    यदि आप सीधे agvtoolपढ़ने के बजाय उपयोग कर रहे Info.plistहैं, तो आप इसके बजाय अपनी स्क्रिप्ट में निम्न जोड़ सकते हैं:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
  9. और अगर आपके पास iPad और iPhone के लिए एक सार्वभौमिक ऐप है, तो आप iPhone फ़ाइल के लिए सेटिंग्स भी सेट कर सकते हैं:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist

17
"मेरी परियोजनाओं में, मेरे पास एक स्क्रिप्ट है जो स्वचालित रूप से हर बार मेरे द्वारा बनाई गई संख्या को बढ़ाती है" - क्या आप यह साझा कर सकते हैं कि आप कैसे करते हैं? विवरण awers के लिए और मूल प्रश्न के लिए धन्यवाद।
Zsolt

2
@Andrews - मैंने बिल्ड स्क्रिप्ट पर विवरण के साथ अपना उत्तर अपडेट किया।
6

9
वृद्धि के लिए हेक्स संख्या में आप उपयोग कर सकते हैंbuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
अलोन अमीर

8
संक्षेप में: AppStore में HEX की अनुमति नहीं है।
निकोलस मिआरी जूल

3
(Xcode 5 उपयोगकर्ता) आपको पढ़ने के लिए चरण 5 बदलने की आवश्यकता हो सकती है: "मेनू बार से, संपादक का चयन करें -> बिल्ड चरण जोड़ें -> रन स्क्रिप्ट स्क्रिप्ट बनाएँ चरण जोड़ें"
ग्रेग एम। क्रास्क

72

(बस इसे अपने संदर्भ के लिए यहाँ छोड़ रहा हूँ।) यह संस्करण दिखाएगा और "संस्करण" और "बिल्ड" फ़ील्ड के लिए बनायेगा जिसे आप Xcode लक्ष्य में देखते हैं:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

स्विफ्ट में

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

2
OT: आपके पास अपनी विधि में एक रिसाव है - आप alloc/ initस्ट्रिंग, जो स्ट्रिंग को बरकरार रखता है, लेकिन आप इसे जारी नहीं कर रहे हैं। किसी ऑब्जेक्ट पर आप किसी विधि से लौटते हैं, तो आपको आमतौर पर एक सुविधा पद्धति का उपयोग करना चाहिए ताकि स्ट्रिंग स्वचालित रूप से स्वचालित हो, या कॉल हो autorelease। या तो: return [NSString stringWithFormat:@"%@ build %@", version, build]; या return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno

1
धन्यवाद @nekno, परिवर्तित उत्तर तो यह एआरसी या गैर-एआरसी अनुकूल है।
डैन रोसेनस्टार्क

2
टाइपिस्ट से बचने के लिए, जहां उपलब्ध हो (जैसे kCFBundleVersionKey), का उपयोग करना बेहतर है। हालाँकि, मैं "CFBundleShortVersionString" के लिए एक नहीं मिला :)
DannyA

आपके पास स्विफ्ट कोड में एक बग है - आप CFBundleShortVersionString को दो बार कॉल कर रहे हैं
Yariv Nissim

धन्यवाद @ yar1vn, मैंने इसे ठीक कर दिया और नहीं यह पीछे नहीं है।
डैन रोसेनस्टार्क

53

बिल्ड नंबर एक आंतरिक संख्या है जो ऐप की वर्तमान स्थिति को इंगित करता है। यह संस्करण संख्या से भिन्न है जिसमें यह आम तौर पर उपयोगकर्ता का सामना नहीं कर रहा है और आमतौर पर होता संस्करण संस्करण की तरह किसी भी अंतर / सुविधाओं / उन्नयन को निरूपित नहीं करता है।

इसके बारे में इस तरह से सोचें:

  • बिल्ड ( CFBundleVersion): बिल्ड की संख्या। आमतौर पर आप इसे 1 से शुरू करते हैं और ऐप के प्रत्येक निर्माण के साथ 1 से बढ़ाते हैं। यह जल्दी से तुलना करने की अनुमति देता है कि कौन सा बिल्ड अधिक हाल ही में है और यह कोडबेस की प्रगति की भावना को दर्शाता है। क्यूए के साथ काम करने और सही बिल्ड के खिलाफ कीड़े को सुनिश्चित करने की आवश्यकता होने पर ये अत्यधिक मूल्यवान हो सकते हैं।
  • मार्केटिंग संस्करण ( CFBundleShortVersionString): आपके एप्लिकेशन के इस संस्करण को निरूपित करने के लिए उपयोगकर्ता द्वारा सामना की जाने वाली संख्या। आमतौर पर यह एक मेजर.इनर वर्जन स्कीम (जैसे MyAwesomeApp 1.2) का अनुसरण करता है ताकि उपयोगकर्ताओं को पता चल सके कि कौन से रिलीज छोटे रखरखाव के अपडेट हैं और कौन से नए फीचर हैं।

अपनी परियोजनाओं में इसे प्रभावी ढंग से उपयोग करने के लिए, ऐप्पल नामक एक महान उपकरण प्रदान करता है agvtoolमैं अत्यधिक उपयोग करने की सलाह देता हूं क्योंकि यह प्लिस्ट परिवर्तनों की स्क्रिप्टिंग की तुलना में अधिक सरल है। यह आपको बिल्ड नंबर और मार्केटिंग संस्करण दोनों को आसानी से सेट करने की अनुमति देता है। यह विशेष रूप से उपयोगी होता है जब स्क्रिप्टिंग (उदाहरण के लिए, आसानी से प्रत्येक बिल्ड पर बिल्ड नंबर को अपडेट करना या यहां तक ​​कि वर्तमान बिल्ड नंबर क्या है, यह क्वेरी करना)। जब आप बिल्ड नंबर को अपडेट करते हैं तो यह आपके एसवीएन को टैग करने के लिए और भी अधिक विदेशी चीजें कर सकता है।

इसके प्रयेाग के लिए:

  • "Apple जेनेरिक" का उपयोग करने के लिए, संस्करण के तहत Xcode में अपनी परियोजना निर्धारित करें।
  • टर्मिनल में
    • agvtool new-version 1 (बिल्ड नंबर को 1 पर सेट करें)
    • agvtool new-marketing-version 1.0 (1.0 के लिए विपणन संस्करण सेट करें)

agvtoolअच्छी जानकारी के एक टन के लिए मैन पेज देखें



25

ऊपर दिए गए उत्तर में बिल्ड नंबर को इंगित करने के लिए स्क्रिप्ट मेरे लिए काम नहीं की अगर बिल्ड नंबर एक फ्लोटिंग पॉइंट वैल्यू है, तो मैंने इसे थोड़ा संशोधित किया:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

21

मार्केटिंग रिलीज़ नंबर ग्राहकों के लिए है, जिसे संस्करण संख्या कहा जाता है । यह 1.0 से शुरू होता है और मामूली अपडेट के लिए 2.0 , 3.0 के प्रमुख अपडेट के लिए जाता है 1.1 , 1.2 के और बग फिक्स के लिए 1.0.1 , 1.0.2 तक जाता है । यह संख्या रिलीज़ और नई सुविधाओं के बारे में उन्मुख है।

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

जैसा कि आप देख सकते हैं, बिल्ड नंबर आवश्यक नहीं है और यह आप पर निर्भर है कि कौन सा नंबर बनाए का उपयोग करना चाहते हैं। इसलिए यदि आप अपने Xcodeप्रमुख संस्करण में अपडेट करते हैं , तो बिल्ड फ़ील्ड खाली है। संस्करण फ़ील्ड रिक्त नहीं हो सकता है !.


पाने के लिए एक NSStringचर के रूप बिल्ड नंबर :

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

पाने के लिए एक NSStringचर के रूप संस्करण संख्या :

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

अगर तुम चाहते हो दोनों एक मेंNSString :

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

इसके साथ परीक्षण किया जाता है Xcode संस्करण 4.6.3 (4H1503) के । बिल्ड नंबर अक्सर कोष्ठक / ब्रेसिज़ में लिखा जाता है। बिल्ड नंबर हेक्साडेसिमल या दशमलव में है।

buildandversion


में Xcode आप ऑटो बढ़ाने के कर सकते हैं बिल्ड नंबर एक के रूप में दशमलव संख्या में निम्नलिखित रखकर Run scriptपरियोजना सेटिंग्स में निर्माण चरण

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

के लिए हेक्साडेसिमल बिल्ड नंबर इस स्क्रिप्ट का उपयोग

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

project_settings


6

शानदार जवाब के लिए @nekno और @ ale84 को धन्यवाद।

हालाँकि, मैंने @ ale84 की स्क्रिप्ट को संशोधित किया है ताकि फ्लोटिंग पॉइंट के लिए बिल्ड संख्या बढ़ाई जा सके।

झुकाव के मूल्य को आपके फ़्लोटिंग प्रारूप आवश्यकताओं के अनुसार बदला जा सकता है। उदाहरण के लिए: अगर incl = .01, आउटपुट स्वरूप होगा ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

1

दूसरा तरीका यह है कि संस्करण संख्या को इसमें सेट करें appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.