현재 iOS 프로젝트의 현재 버전을 코드로 가져 오려면 어떻게합니까?


151

NSString어딘가에 파일에 상수를 정의하지 않고도 iOS 프로젝트 / 앱의 현재 버전을 객체 로 얻을 수 있기를 원합니다 . 버전 값을 2 곳에서 변경하고 싶지 않습니다.

프로젝트 대상 요약에서 버전을 충돌 시키면 값을 업데이트해야합니다.

답변:


381

다음과 같이 버전 및 빌드 번호를 얻을 수 있습니다.

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String

또는 Objective-C에서

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];

카테고리에 다음과 같은 방법이 있습니다 UIApplication.

extension UIApplication {

    static var appVersion: String {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    }

    static var appBuild: String {
        return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
    }

    static var versionBuild: String {
        let version = appVersion, build = appBuild            
        return version == build ? "v\(version)" : "v\(version)(\(build))"
    }
}

요지 : https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Objective-C와 동등한 기능은 다음과 같습니다.

+ (NSString *) appVersion
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];    
}

+ (NSString *) build
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}

+ (NSString *) versionBuild
{
    NSString * version = [self appVersion];
    NSString * build = [self build];

    NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];

    if (![version isEqualToString: build]) {
        versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
    }

    return versionBuild;
}

요점 : https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
[[NSBundle mainBundle] objectForInfoDictionaryKey : (NSString *) kCFBundleVersionKey] 대신 [[NSBundle mainBundle] objectForInfoDictionaryKey : @ "CFBundleVersion"]을 사용할 수 있습니다. ]; 그래서 이제 기억하기가 쉬워졌습니다
Durai Amuthan. H

4
@Duraiamuthan (NSString *)kCFBundleVersionKey보다는을 사용 하는 것이 좋습니다 @"CFBundleVersion". 입력 시간이 길어도 (자동 완성이 도움이 될 것입니다) 상수이므로 컴파일 타임에 확인됩니다.
Ashley Mills

Btw, NSBundle대신 이 확장을 설정 하는 것이 더 정확 UIApplication합니다. 정적 호출을 인스턴스 호출로 대체 할 수도 있습니다.
Zapko

@Zapko-나는 동의하지 않습니다. UIApplication반환 된 정보가 응용 프로그램에 관한 것이므로 개념적으로이에 맞습니다 . 또한 이것은 main번들 에만 적용됩니다. 번들에서 인스턴스 메소드로 만드는 것은 의미가 없습니다.
Ashley Mills

(코드의 두 번째 줄에서) build말했을 때 의미 했습니까 appBundle?
user1046037

14

Xcode 8, Swift 3 에서 작동 한 내용은 다음과 같습니다 .

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")

3

목표 C에서 :

1) 앱 버전을 얻으려면 다음을 사용해야합니다.

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

2) 빌드 버전을 얻으려면 다음을 사용해야합니다.

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

1

Swift에서는 다음을 사용하여 번들 버전을 얻을 수 있습니다.

let info:NSDictionary = NSBundle.mainBundle().infoDictionary!

let version:String = info.objectForKey("CFBundleShortVersionString") as! String

versionLabel.text = "Version:" + version

0

내 오픈 소스 프로젝트 인 App Update Tracker 는 다음과 같은 클래스 메소드 형식으로이 기능을 제공합니다.

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

다음과 같이 사용하십시오.

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);

0

참고로

모든 키의 현지화 된 값을 얻으려면 사용해야합니다 CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

따라서 여기 둘 다에 대한 Swift 버전이 있습니다.

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

이 저장소에 포함되어 있으므로 확인하십시오.

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey는 더 이상 Xcode 8 및 Swift 3에서 작동하지 않습니다. 새 키를 알고 있습니까?
Crashalot

다음은 최신 정보입니다 : github.com/goktugyil/EZSwiftExtensions/blob/…
Esqarrouth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.