iOS 앱에서 프로그래밍 방식으로 대상 버전 / 빌드 수를 표시하는 방법은 무엇입니까?


135

target version아래 이미지와 같이 프로그래밍 방식으로의 값을 얻는 방법은 무엇입니까?

내 Xcode 프로젝트 대상의 속성 창에서 볼 수 있습니다. 사람들이 현재 사용중인 버전을 알 수 있도록 앱의 스플래시 화면에 이것을 표시하고 싶습니다.

답변:


392

있다 2 개 숫자!

마케팅 릴리스 번호는 고객을위한 버전 번호 입니다. 1.0 부터 시작 하여 2.0 , 3.0의 주요 업데이트 , 1.1 , 1.2의 작은 업데이트 및 1.0.1 , 1.0.2의 버그 수정에 사용됩니다 . 이 숫자는 릴리스 및 새로운 기능에 관한 것입니다. 9에서 멈출 필요없으며 1.11.23 은 합리적인 버전 번호입니다.

빌드 번호는 대부분입니다 빌드의 내부 번호 가 그때까지되었습니다. 그러나 일부는 리포지토리의 분기 번호 또는 커밋 번호와 같은 다른 숫자를 사용합니다. 이 숫자 는 약간의 증분 변경 만있는 다른 빌드를 구별하기 위해 고유 해야합니다 .


버전 번호 를 얻으려면

목표 -C :

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

스위프트 <3.0 :

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

스위프트 3.0 이상 (5.0으로 테스트) :

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

빌드 번호 를 얻으려면 :

목표 -C :

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

스위프트 <3.0 :

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

스위프트 3.0 이상 (5.0까지 테스트) :

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

둘 다 원하는 경우 :

먼저 위의 줄을 사용하고 다음 줄을 사용하십시오.

목표 -C :

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

스위프트 (5.0까지 테스트) :

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

노트:

주요 번들의 값은 명령 줄 응용 프로그램의 예를 들어이 더있다, 항상 존재하지 않습니다 CFBundleShortVersionString또는 CFBundleVersion메소드가 리턴되도록 nil하고 코드에가 잘못된 풀이 죽은하게 있기 때문에 충돌합니다. 그러나 일반적인 Cocoa iOS 및 Mac 앱에서는 이러한 값이 정의되어 삭제되지 않습니다.

이것은 Xcode 버전 7.3 (7D175) 로 테스트되었습니다 . 빌드 번호는 종종 괄호 안에 표시됩니다. 빌드 번호는 16 진수 또는 10 진수입니다.

빌드 앤 버전


Xcode 에서는 프로젝트 설정 의 빌드 단계에 다음을 배치하여 빌드 번호10 진수 로 자동 증가시킬 수 있습니다.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"

다음을 Xcode수행하십시오.

1 단계

1 단계

2 단계

2 단계

3 단계

step3


4
위의 예를 추가하기 위해 "CFBundleVersion"은 Build = 300이고 "CFBundleShortVersionString"은 Version = 0.41입니다. 빅토르의 답변이 정답이어야합니다.
justinkoh

1
16 진수에 한 번 문제가있었습니다. 애플은 정수를 사용
하라고 말한다

@ "CFBundleShortVersionString"및 @ "CFBundleVersion"에 대한 문자열 상수가 있는지 알고 있습니까?
igrek

CI / CD 시스템이 일반적이기 때문에 빌드 스크립트를 사용하여 버전 번호를 설정하는 데 따르는 함정을 지적 할 수 있습니다.
Sam Ballantyne

1
Swift 3.0의 이름이 바뀌 었습니다 Bundle.main.object(forInfoDictionaryKey: "...").
Raphael

13

프로젝트 또는 Xcode에서 아무것도 변경할 필요가 없습니다. Swift 버전은 다음과 같습니다.

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

이 리포지토리에 포함되어 있으므로 확인하십시오.

https://github.com/goktugyil/EZSwiftExtensions


어떤 대답? 나는 그것을 보지 않는다
Esqarrouth

답은 한 가지뿐입니다. 두 번째 단락 인
Daniel Galasko

3
예, 1. 그의 답변에 너무 많은 소음이 있고 신호가 많지 않습니다. 2. 이것은 빠르다. 즉 객관적이다. c. 3. ios5 시대의 것
Esqarrouth

Swift 3.0의 이름이 바뀌 었습니다 Bundle.main.object(forInfoDictionaryKey: "...").
Raphael

5

Swift 3에 대한 동일한 코드는 다음과 같습니다 .

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

Bundle.maininfoDictionary나를 위해 비어 있었다; 어쩌면 내가 실행 파일이나 앱이 아닌 프레임 워크 내에서 그것을하고 있기 때문일까요? Bundle(for: MyClass.self)예상 값을 포함합니다.
Raphael

4

프로그래밍 방식으로 버전 및 빌드 번호 표시-Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

1

당신은 또한 사용할 수 있습니다

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

그러면 Globally를 선언 할 때 어디서나 사용할 수 있습니다.

print(appVersion)

산출:

Version: #1.0 (#1.0.3)

1

번들을 확장하여 사용하기 쉽습니다.

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.