Xcode에서 버전 대 빌드


660

Xcode 3으로 개발하고 최근 Xcode 4로 편집하기 시작한 앱이 있습니다. 대상 요약에는 식별자, 버전, 빌드, 장치 및 배포 대상 필드가있는 iOS 응용 프로그램 대상 양식이 있습니다. 버전 필드는 비어 있고 빌드 필드는 3.4.0입니다 (여전히 Xcode 3으로 편집 할 때의 앱 버전과 일치합니다).

내 질문은 :

  1. 버전과 빌드 필드의 차이점은 무엇입니까?

  2. Xcode 4로 업그레이드 한 후 버전 필드가 비어있는 이유는 무엇입니까?


우선 Xcode Organizer 아카이브 목록에 나타나는 빌드 번호라고 생각합니다. 그 외에는 그것이 무엇을 사용하는지 잘 모르겠습니다.
Daniel Dickison

답변:


1224

애플은 재배치 / 재용도 분야에 해당합니다.

앞으로 응용 프로그램 대상의 정보 탭을 보면 "번들 버전 문자열, 짧은"을 버전 (예 : 3.4.0)으로, "번들 버전"을 빌드 (예 : 500 또는 1A500)로 사용해야합니다. ). 둘 다 표시되지 않으면 추가 할 수 있습니다. 그것들은 요약 탭에서 적절한 버전 및 빌드 텍스트 상자에 매핑됩니다. 그것들은 같은 값입니다.

정보 탭을 볼 때 마우스 오른쪽 버튼을 클릭하고 원시 키 / 값 표시를 선택 하면 실제 이름은 CFBundleShortVersionString(버전) 및 CFBundleVersion(빌드)입니다.

버전은 일반적으로 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 메뉴> About Xcode 로 이동 하면 버전 및 빌드 번호가 표시됩니다. 당신이 공격하면 더 많은 정보를 ... 버튼을 사용하면 서로 다른 버전의 무리를 볼 수 있습니다. 이후 추가 정보 ... 버튼이 엑스 코드 5를 제거하고,이 정보는에서 구할 소프트웨어> 개발자 의 섹션 시스템 정보 , 응용 프로그램 열어 사용할 수 애플 메뉴> 이 매킨토시에 관하여 > ... 시스템 보고서 .

예를 들어, Xcode 4.2 (4C139)입니다. 마케팅 버전 4.2는 빌드 메이저 버전 4, 빌드 마이너 버전 C 및 빌드 번호 139입니다. 다음 릴리스 (아마도 4.3)는 빌드 릴리스 4D 일 가능성이 높으며 빌드 번호는 0에서 다시 시작하여 증가합니다.

iPhone 시뮬레이터 버전 / 빌드 번호는 iPhone, Mac 등과 같은 방식입니다.

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

업데이트 : 요청에 따라 Xcode에서 앱을 빌드 할 때마다 빌드 번호를 읽고, 증가시키고, 앱의 {App}-Info.plist파일에 다시 쓸 때마다 실행되는 스크립트를 만드는 단계가 있습니다 . 버전 / 빌드 번호를 Settings.bundle/Root*.plist파일 에 쓰려면 선택적인 추가 단계가 있습니다 .

이 방법은 here 기사에서 확장되었습니다 .

Xcode 4.2-5.0에서 :

  1. Xcode 프로젝트를로드하십시오.
  2. 왼쪽 창에서 계층의 맨 위에있는 프로젝트를 클릭하십시오. 프로젝트 설정 편집기가로드됩니다.
  3. 중앙 윈도우 창 왼쪽 편에, 아래의 앱을 클릭 TARGETS 제목. 각 프로젝트 대상에 대해이 설정을 구성해야합니다.
  4. 빌드 단계 탭을 선택 하십시오.
    • Xcode 4의 오른쪽 하단에서 빌드 단계 추가 단추를 클릭하고 실행 스크립트 추가를 선택 하십시오 .
    • Xcode 5에서 편집기 메뉴> 빌드 단계 추가 > 실행 스크립트 빌드 단계 추가를 선택하십시오 .
  5. 새로운 Run Script 단계를 끌어다 놓아 Bundle Resources 복사 단계 직전 (app-info.plist 파일이 앱과 번들로 제공 될 때)으로 이동하십시오.
  6. 새로운 Run Script 단계에서 Shell :을 설정 /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 Generic Versioning Tool ( agvtool)도 사용할 수 있습니다. 대신 그것을 사용하려면 먼저 변경해야 할 몇 가지가 있습니다.

    • 빌드 설정 탭을 선택 하십시오.
    • 언더 버전 관리 섹션에서 설정 현재 프로젝트 버전을 사용하려는 초기 빌드 번호, 예를 들어,에 1 .
    • 빌드 단계 탭으로 돌아가서 번들 자원 복사 단계 후에 스크립트 실행 단계 를 끌어서 놓아 빌드 번호가 포함 된 소스 파일을 빌드하고 업데이트 할 때 경쟁 조건을 피하십시오.

    agvtool방법을 사용하면 오류없이 주기적으로 빌드가 실패 / 취소 될 수 있습니다. agvtool따라서이 스크립트와 함께 사용하지 않는 것이 좋습니다 .

    그럼에도 불구하고 스크립트 실행 단계에서 다음 스크립트를 사용할 수 있습니다.

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

    next-version인수는 빌드 번호 (증가 bump도 같은 일의 별칭), 및 -all업데이트 Info.plist새로운 빌드 번호.

  8. 버전 및 빌드를 표시하는 설정 번들이있는 경우 스크립트 끝에 다음을 추가하여 버전을 업데이트하고 빌드 할 수 있습니다. 참고 : PreferenceSpecifiers설정과 일치 하도록 값을 변경하십시오 . PreferenceSpecifiers:2PreferenceSpecifiersplist 파일 의 배열 아래에서 인덱스 2의 항목을 확인 하므로 0 기반 인덱스의 경우 배열의 세 번째 기본 설정입니다.

    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
"내 프로젝트에는 빌드 할 때마다 빌드 번호가 자동으로 증가하는 스크립트가 있습니다"-어떻게 공유 할 수 있습니까? 자세한 답변과 원래 질문에 감사드립니다.
Zsolt

2
@Andrews-빌드 스크립트에 대한 세부 정보로 답변을 업데이트했습니다.
nekno

9
16 진수로 증가시키기 위해 사용할 수 있습니다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"
Alon Amir

8
한마디로 : HEX는 AppStore에서 허용되지 않습니다.
Nicolas Miari

3
(Xcode 5 사용자) "메뉴 표시 줄에서 편집기-> 빌드 단계 추가-> 실행 스크립트 빌드 단계 추가"를 읽으려면 5 단계를 변경해야합니다.
Greg M. Krsak

72

(이것은 내 참조를 위해 여기에 남겨 두십시오.) 그러면 Xcode 대상에 표시되는 "version"및 "build"필드의 버전 및 빌드가 표시됩니다.

- (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, 답변이 변경되어 ARC 또는 비 ARC 친화적입니다.
Dan Rosenstark

2
오타를 피하기 위해 가능한 경우 상수 (예 : kCFBundleVersionKey)를 사용하는 것이 좋습니다. 그래도 "CFBundleShortVersionString"에 대한 하나를 찾을 수 없었습니다.
DannyA

당신은 빠른 코드에서 버그를 가지고 - 당신은 두 번 CFBundleShortVersionString를 호출하고
Yariv Nissim

감사합니다 @ yar1vn, 나는 그것을 고쳤으며 NO는 거꾸로 아닙니다.
Dan Rosenstark

53

빌드 번호는 앱의 현재 상태를 나타내는 내부 번호입니다. 일반적으로 사용자가 직면하지 않으며 버전 번호와 달리 차이점 / 기능 / 업그레이드를 나타내지 않는다는 점에서 버전 번호와 다릅니다.

다음과 같이 생각하십시오.

  • 빌드 ( CFBundleVersion) : 빌드 수입니다. 일반적으로 1에서 시작하여 각 앱 빌드마다 1 씩 증가합니다. 최신 빌드를 비교할 수 있으며 코드베이스의 진행 감각을 나타냅니다. QA로 작업하고 올바른 빌드에 대해 버그가 기록되었는지 확인해야 할 때 이러한 기능은 압도적으로 가치가 있습니다.
  • 마케팅 버전 ( CFBundleShortVersionString) :이 버전의 앱을 나타내는 데 사용하는 사용자 대면 번호입니다. 일반적으로 Major.minor 버전 체계 (예 : MyAwesomeApp 1.2)를 따라 유지 보수 업데이트가 작은 릴리스와 새로운 기능이 많은 릴리스를 사용자에게 알립니다.

프로젝트에서이를 효과적으로 사용하기 위해 Apple은이라는 훌륭한 도구를 제공합니다 agvtool. plist 변경을 스크립팅하는 것보다 훨씬 간단하므로 이것을 사용하는 것이 좋습니다. 빌드 번호와 마케팅 버전을 쉽게 설정할 수 있습니다. 스크립팅 할 때 특히 유용합니다 (예를 들어, 각 빌드에서 빌드 번호를 쉽게 업데이트하거나 현재 빌드 번호를 쿼리하기까지). 빌드 번호를 업데이트 할 때 SVN에 태그를 지정하는 것과 같은 이국적인 일을 할 수도 있습니다.

그것을 사용하려면 :

  • "Apple Generic"을 사용하도록 버전 관리에서 Xcode로 프로젝트를 설정하십시오.
  • 터미널에서
    • agvtool new-version 1 (빌드 번호를 1로 설정)
    • agvtool new-marketing-version 1.0 (마케팅 버전을 1.0으로 설정)

agvtool많은 좋은 정보 는 man 페이지를 참조하십시오



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)으로 테스트되었습니다 . 빌드 번호는 종종 괄호 안에 표시됩니다. 빌드 번호는 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"

project_settings


6

훌륭한 답변을 주신 @nekno와 @ ale84에게 감사합니다.

그러나 @ ale84의 스크립트를 수정하여 부동 소수점의 빌드 번호를 거의 늘리지 않았습니다.

부동 형식 요구 사항에 따라 incl 값을 변경할 수 있습니다. 예를 들어 : 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];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.