내 iPhone 앱이 자체 버전 번호를 어떻게 감지합니까?


254

iPhone 앱을 작성 중입니다. 이미 게시되었지만 버전 번호가 표시되는 기능을 추가하고 싶습니다.

오히려 릴리스 할 각 버전마다 수동 으로이 작업을 수행하지 않아도됩니다 ...

objective-C에 내 앱의 버전이 무엇인지 알아내는 방법이 있습니까?


1
이 질문은 이미 stackoverflow.com/a/16888788/2890157 에서 답변되었습니다 .
Akshat Singhal 5

1
여기 진짜 문제는 CMOS가 결코 그래서 .. 링크 된 질문은 4 년 후입니다 허용되지 답변을. 어쨌든 링크 된 질문의 답변은 여기에있는 답변과 마찬가지로 유용합니다. 두 스레드 모두에서 첫 번째 답변을 넘어서는 경우가 있습니다. 때로는 이후 답변에 대한 최신 정보가 있습니다.
ToolmakerSteve

답변:


222

여기서 설명하는 것처럼 스크립트를 사용하여 현재 Subversion 개정 번호로 헤더 파일을 다시 씁니다. 해당 개정 번호는 kRevisionNumber 상수에 저장됩니다. 그런 다음 다음과 유사한 것을 사용하여 버전 및 개정판 번호에 액세스 할 수 있습니다.

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

"버전 1.0 (51)"형식의 문자열을 만듭니다.


152
빌드 버전을 반환 하여이 버전을 사용했습니다. [[[NSBundle mainBundle] infoDictionary] objectForKey : @ "CFBundleShortVersionString"]
jspooner

6
Xcode가 해당 plist 항목을 버전 번호가 아닌 빌드 번호로 잘못 채우므로 CFBundleVersion이 올바르지 않습니다. jspooner가 정확합니다.
Oscar

4
버전 대 빌드 번호에 대한 자세한 설명은 stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 를 참조하십시오 . CFBundleShortVersionString일반적으로 '버전'및 CFBundleVersion빌드 번호에 원하는 것을 확인합니다 .
Rory

3
kRevisionNumber가 작동하지 않는 것 같습니다. 출력을 지정하려면 @jspooner 수정 프로그램을 사용하여이 작업을 수행했습니다.[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Brad Larson의 답변을 바탕으로 info plist에 메이저 및 마이너 버전 정보가 저장되어 있으면 (특정 프로젝트에서했던 것처럼) 이것이 잘 작동했습니다.

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

이제 부 버전을 수동으로 수정하는 것은 어려울 수 있으므로 소스 리포지토리 수정 번호 트릭을 사용하는 것이 이상적입니다. 내가 묶지 않은 것처럼 묶지 않았다면 위의 스 니펫이 유용 할 수 있습니다. 또한 앱의 표시 이름을 가져옵니다.


59

둘 다 별도로 스위프트 버전 :

스위프트 3

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

스위프트 2

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

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

https://github.com/goktugyil/EZSwiftExtensions


42

이것이 제가 신청서에서 한 일입니다

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

이 간단한 대답이 누군가를 도울 수 있기를 바랍니다.


1
내 필요에 따라 이것은 훌륭합니다. 감사. +1
David DelMonte

1
이 빌드의 이름을 반환하지 버전
chancyWu

@chancyWu, CFBundleShortVersionString이 버전을 제공하는 것으로 보입니다.
Brian F Leighty


30

빌드 버전과 앱 버전의 두 가지가 있습니다.

  1. 앱 버전을 받으려면 :

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. 빌드 버전을 얻으려면 :

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

이 둘 사이에 어떤 차이가 있습니까? 둘 다 나에게 똑같이 돌아옵니다.
jjnevis

예, 빌드 번호와 앱 버전이 설정에서 동일 할 수 있습니다.
Shaik Riyaz

좋아, RAKEFILE-app.version (RubyMotion을 사용하고있다)에 하나의 설정 만 있습니다. 내 필요에 따라 할 것 같아요. 감사합니다
jjnevis 2016 년

고마워 친구 부드럽게 일했습니다.
Felipe

1
참고 전자가 현지화 된 값을 반환하기 때문에 objectForInfoDictionaryKey:대신 사용 하는 것이 좋습니다 infoDictionary] objectForKey:(있는 경우). 아마 여기에 차이를 만들지 않을 것입니다;)
deanWombourne

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
정확히 내가 필요한 것!
Julius

16

XYZ 형식으로 버전 문자열을 얻는 간결한 방법 은 다음과 같습니다.

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

또는 XY의 경우 :

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

이 스 니펫은 라벨 객체의 텍스트 속성에 할당 할 문자열을 반환합니다. 예 :

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

사전을 다음과 같이 사용해보십시오.

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

앱의 info.plist 파일을 읽고 키 CFBundleShortVersionString의 값을 가져 오십시오. info.plist를 읽으면 NSDictionary 객체가 제공됩니다.


4

infoDictionary를 사용하면 app의 info.plist에서 버전 세부 정보를 얻을 수 있습니다. 이 코드는 빠른 3에서 작동합니다.이 메소드를 호출하고 선호하는 UI 요소에 버전을 표시하십시오.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}

3

스위프트 5 :

앱 버전과 빌드 버전, 두 가지가 있습니다

  • 앱 버전을 받으려면 :

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • 빌드 버전을 얻으려면 :

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

감사합니다 @Brad Larson♦많이합니다


1

당신이 필요한 경우 조합 모두의 버전 빌드 NUM을 , 여기에 사용하는 간단한 방법 스위프트 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

객체의 일부만 가져 오려면 또는 줄 as! String끝에 an 을 추가하십시오 . 전체를 찾고 있다면 그럴 필요가 없습니다.appVersionbuildNumStringversionInfo .

이게 도움이 되길 바란다!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

@rajat chauhan의 답변을 기반으로 강제로 캐스팅하지 않았습니다 String.


0

이것은 개정 제어 시스템으로 처리하는 것이 좋습니다. 이렇게하면 사용자로부터 버그 보고서를 얻을 때 해당 코드 개정을 확인하고 사용자와 정확히 동일한 코드를 실행하는 버그를 재현 할 수 있습니다.

아이디어는 빌드를 수행 할 때마다 코드의 현재 개정 번호를 가져오고 프로젝트 내의 파일을 업데이트하는 스크립트를 실행하는 것입니다 (보통 어떤 형태의 토큰 대체로). 그런 다음 항상 오류 출력에 개정 번호를 포함하는 오류 처리 루틴을 작성하거나 "정보"페이지에 표시 할 수 있습니다.


0

이 방법을 시도해 볼 수 있습니다.

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.