사용법 - 코르도바 ios




버전 대 Xcode 빌드 (5)

나는 Xcode 3으로 개발 한 앱을 가지고 있으며 최근에 Xcode 4로 편집하기 시작했습니다. 타겟 요약에서 식별자, 버전, 빌드, 장치 및 배포 대상과 같은 필드가있는 iOS 애플리케이션 대상 양식이 있습니다. 버전 필드는 비어 있고 빌드 필드는 3.4.0입니다 (이는 Xcode 3으로 편집 중이던 때의 앱 버전과 일치합니다).

내 질문은 다음과 같습니다.

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

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


(그냥 내 자신의 참조를 위해 여기를 남겨주세요.) Xcode 대상에서 볼 수있는 "버전"및 "빌드"필드의 버전과 빌드를 보여줍니다 :

- (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)"
}

또 다른 방법은 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];
}

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

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

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

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

그것을 사용하려면 :

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

훌륭한 정보를 agvtool 위해 agvtool 의 맨 페이지를 agvtool


애플은 필드 재배치 / 용도 변경.

앞으로 Application Target의 Info 탭을 보면 버전 (예 : 3.4.0)과 번들 버전 (Bundle versions string)을 Build (예 : 500 또는 1A500)로 사용해야합니다 ). 둘 다 표시되지 않으면 추가 할 수 있습니다. 요약 탭의 적절한 버전 및 빌드 텍스트 상자에 매핑됩니다. 그들은 같은 값입니다.

Info 탭에서 마우스 오른쪽 버튼을 클릭하고 Show Raw Keys / Values를 선택하면 실제 이름은 CFBundleShortVersionString (Version)과 CFBundleVersion (Build)입니다.

버전은 대개 Xcode 3에서 사용 된 것처럼 보입니다. 버전 / 빌드의 차이점에 대해 묻는 수준이 확실하지 않으므로 철학적으로 대답하겠습니다.

모든 종류의 제도가 있지만 인기있는 제도는 다음과 같습니다.

{MajorVersion}. {MinorVersion}. {Revision}

  • 주요 버전 - 주요 변경 사항, 재 설계 및 기능 변경
  • 부 버전 - 사소한 개선, 기능 추가
  • Revision - 버그 수정을위한 패치 번호

그런 다음 빌드를 사용하여 릴리스 또는 전체 제품 수명의 총 빌드 수를 나타냅니다.

많은 개발자들이 빌드 번호를 0으로 시작하고 빌드 할 때마다 번호를 1 씩 늘려 영원히 증가시킵니다. 내 프로젝트에는 빌드 할 때마다 빌드 번호를 자동으로 증가시키는 스크립트가 있습니다. 아래 지침을 참조하십시오.

  • 릴리스 1.0.0은 빌드 542 일 수 있습니다. 1.0.0 릴리스를 얻으려면 542 개의 빌드가 필요합니다.
  • 릴리스 1.0.1은 빌드 578 일 수 있습니다.
  • 릴리스 1.1.0은 빌드 694 일 수 있습니다.
  • 릴리스 2.0.0은 빌드 949 일 수 있습니다.

애플을 포함한 다른 개발자들은 메이저 버전 + 마이너 버전 + 릴리즈 번호로 구성된 빌드 번호를 가지고있다. 마케팅에 사용되는 값과는 대조적으로 실제 소프트웨어 버전 번호입니다.

Xcode 메뉴> Xcode 정보 로 이동하면 버전 번호와 빌드 번호가 표시됩니다. More Info ... 버튼을 누르면 다양한 버전이 표시됩니다. Xcode 5에서 More Info ... 버튼이 제거되었으므로이 정보는 시스템 정보 응용 프로그램의 소프트웨어> 개발자 섹션에서도 사용할 수 있습니다.이 정보는 Apple 메뉴> Mac 정보 > 시스템 보고서 ... 를 열어 사용할 수 있습니다.

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

iPhone Simulator 버전 / 빌드 번호는 iPhone, Mac 등과 같은 방식입니다.

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

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

이것은 하우투 문서에서 확장되었습니다.

Xcode 4.2 - 5.0 :

  1. Xcode 프로젝트를로드하십시오.
  2. 왼쪽 창에서 가장 위에있는 프로젝트를 클릭하십시오. 그러면 프로젝트 설정 편집기가로드됩니다.
  3. 중앙 창틀의 왼쪽에서 대상 표제 아래에있는 앱을 클릭하십시오. 각 프로젝트 대상에 대해이 설정을 구성해야합니다.
  4. 빌드 단계 탭을 선택하십시오.
    • Xcode 4의 오른쪽 하단에서 Add Build Phase 버튼을 클릭하고 Add Run Script를 선택 하십시오 .
    • Xcode 5에서, 에디터 메뉴> 빌드 단계 추가 > 스크립트 빌드 단계 추가를 선택하십시오 .
  5. 새로운 스크립트 실행 단계를 드래그 앤 드롭하여 번들 리소스 복사 단계 (app-info.plist 파일이 앱과 번들 될 때) 바로 앞으로 이동하십시오.
  6. 새로운 스크립트 실행 단계에서 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)로 설정하십시오 .
    • Build Phases 탭으로 돌아가서 Build Bundle Resources 단계 후에 Run Script 단계를 드래그 앤 드롭하여 빌드 번호가 포함 된 소스 파일을 빌드하고 업데이트 할 때 경쟁 조건을 피하십시오.

    agvtool 메소드를 사용하면 오류가없는 실패 / 취소 된 빌드를 주기적으로 얻을 수 있습니다. 이러한 이유 때문에이 스크립트에서 agvtool 을 사용하지 않는 것이 좋습니다.

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

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

    next-version 인수는 빌드 번호를 증가시키고 ( bump 는 동일한 것의 별칭이기도 함), -all Info.plist 를 새로운 빌드 번호로 갱신합니다.

  8. 버전 및 빌드를 표시하는 설정 번들이있는 경우 스크립트의 끝에 다음을 추가하여 버전 및 빌드를 업데이트 할 수 있습니다. 참고 : 설정과 일치하도록 PreferenceSpecifiers 값을 변경하십시오. PreferenceSpecifiers:2 는 plist 파일의 PreferenceSpecifiers 배열 아래에있는 인덱스 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
    

    Info.plist 직접 읽지 않고 agvtool 을 사용하는 경우 스크립트에 다음을 대신 추가 할 수 있습니다.

    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
    

훌륭한 답변을 위해 @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"




xcode