आईओएस ऐप, प्रोग्रामेटिक रूप से बिल्ड वर्जन प्राप्त करें


127

क्या प्रोग्राम को मेरे ऐप का बिल्ड वर्जन प्राप्त करने का कोई तरीका है? मुझे यह पता लगाने में सक्षम होना चाहिए कि उपयोगकर्ता ने AppStore के माध्यम से ऐप को अपडेट किया है, ताकि समायोजन के लिए कुछ कोड निष्पादित किया जा सके।



इसके अलावा stackoverflow.com/questions/458632/…
rodamn

जवाबों:


284

Xcode लक्ष्य सारांश के "संस्करण" फ़ील्ड में आपके द्वारा निर्धारित मूल्य यहाँ है:

स्विफ्ट 3

let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

ObjC

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

स्विफ्ट 2

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as! String

और "बिल्ड":

स्विफ्ट 3

let build = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String

ObjC

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

स्विफ्ट 2

let build = NSBundle.mainBundle().infoDictionary?[kCFBundleVersionKey as String] as! String

5
स्ट्रिंग शाब्दिक का उपयोग करना और स्थिर न होना भविष्य का प्रमाण नहीं है; निरंतर कुंजियों के लिए अनूपदास का उत्तर देखें।
एरॉन ब्रेजर

9
आप @ "CFBundleVersion" के लिए सही हैं - मैंने अपना उत्तर संपादित कर लिया है। हालांकि @ "CFBundleShortVersionString" के लिए कोई निरंतर AFAIK नहीं है।
e1985

स्विफ्ट के लिए, NSBundle.mainBundle()अब हैBundle.main
टोड

85

आप इनफॉरमेंस का इस्तेमाल करके देख सकते हैं

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 

13
kCFBundleVersionKey 'बिल्ड' नहीं 'संस्करण' है
powerj1984

11

का उपयोग करते समय MFMailComposeViewControllerएक "हमसे संपर्क करें" बटन के लिए, मैं उपयोगकर्ता से ई-मेल पर प्राप्त एक स्वरूपित एचटीएमएल के लिए इस कोड का उपयोग करें। यह मुझे वह सारी जानकारी देता है जिसकी मुझे किसी भी समस्या को सुलझाने में मदद करने की आवश्यकता है:

struct utsname systemInfo;
uname(&systemInfo);

NSDateFormatter *formatter = [[NSDateFormatter alloc]  init];
NSDate  *date = [NSDate date];
[formatter setDateFormat:@"MM/dd/yyyy 'at' hh:mm a"];
NSString *dateString = [formatter stringFromDate:date];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 65.0;

NSString *comments = NSLocalizedString(@"Please write your comments below:", nil);
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];

NSString *emailBody = [NSString stringWithFormat:@"<!DOCTYPE html><html><style> .div {background-color: lightgrey; width: %fpx; padding: 10px; border: 5px solid navy; margin: 2px;}</style><body><div class='div'><p><b>App:</b> %@</p><b><p>Device:</b> %@</p><b><p>iOS Version:</b> %@</p><b><p><p>App Version and Build:</b> %@ (%@)</p><b><p>Date:</b> %@</p> </p></div><font color='red'><b>%@</b></font><br><br></body></html>",screenWidth,appName,deviceModel,iOSVersion,version,build,dateString,comments];

[self setMessageBody:emailBody isHTML:YES];

यह संदेश मिलने पर परिणाम है:

यहाँ छवि विवरण दर्ज करें


3

दोनों के लिए अलग से स्विफ्ट संस्करण:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

इस रेपो में इसके शामिल हैं, इसे देखें:

https://github.com/goktugyil/EZSwiftExtensions


आपको यह स्पष्ट करना चाहिए कि आप उस रेपो के मालिक हैं। आप एक स्पैमर के रूप में नहीं आना चाहते हैं।
JAL

2

विवरण

  • Xcode संस्करण 10.3 (10G8), स्विफ्ट 5

उपाय

class Info {
    static let dictionary = Bundle.main.infoDictionary ?? [:]
    enum Value {
        case build, version
    }
}

extension Info.Value {

    var key: String {
        switch self {
            case .build: return kCFBundleVersionKey as String
            case .version: return kCFBundleInfoDictionaryVersionKey as String
        }
    }

    var string: String? { return Info.dictionary[key] as? String }
}

प्रयोग

if let value = Info.Value.version.string { print("Version: \(value)") }
if let value = Info.Value.build.string { print("Build: \(value)") }

परिणाम

प्रोजेक्ट सेटिंग्स

यहाँ छवि विवरण दर्ज करें


1

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

मैंने हाल ही में इसके बारे में एक ब्लॉग पोस्ट भी लिखा है।


1

1) ऐप संस्करण प्राप्त करने के लिए आपको एक का उपयोग करना होगा:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

2) बिल्ड संस्करण प्राप्त करने के लिए आपको एक का उपयोग करना होगा:

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