Xcode 3으로 개발하고 최근 Xcode 4로 편집하기 시작한 앱이 있습니다. 대상 요약에는 식별자, 버전, 빌드, 장치 및 배포 대상 필드가있는 iOS 응용 프로그램 대상 양식이 있습니다. 버전 필드는 비어 있고 빌드 필드는 3.4.0입니다 (여전히 Xcode 3으로 편집 할 때의 앱 버전과 일치합니다).
내 질문은 :
-
버전과 빌드 필드의 차이점은 무엇입니까?
-
Xcode 4로 업그레이드 한 후 버전 필드가 비어있는 이유는 무엇입니까?
답변
애플은 재배치 / 재용도 분야에 해당합니다.
앞으로 응용 프로그램 대상의 정보 탭을 보면 “번들 버전 문자열, 짧은”을 버전 (예 : 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에서 :
- Xcode 프로젝트를로드하십시오.
- 왼쪽 창에서 계층의 맨 위에있는 프로젝트를 클릭하십시오. 프로젝트 설정 편집기가로드됩니다.
- 중앙 윈도우 창 왼쪽 편에, 아래의 앱을 클릭 TARGETS 제목. 각 프로젝트 대상에 대해이 설정을 구성해야합니다.
- 빌드 단계 탭을 선택 하십시오.
-
- Xcode 4의 오른쪽 하단에서 빌드 단계 추가 단추를 클릭하고 실행 스크립트 추가를 선택 하십시오 .
- Xcode 5에서 편집기 메뉴> 빌드 단계 추가 > 실행 스크립트 빌드 단계 추가를 선택하십시오 .
- 새로운 Run Script 단계를 끌어다 놓아 Bundle Resources 복사 단계 직전 (app-info.plist 파일이 앱과 번들로 제공 될 때)으로 이동하십시오.
- 새로운 Run Script 단계에서 Shell :을 설정
/bin/bash
합니다. -
정수 빌드 번호를 위해 스크립트 영역에 다음을 복사하여 붙여 넣습니다.
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
새로운 빌드 번호. -
버전 및 빌드를 표시하는 설정 번들이있는 경우 스크립트 끝에 다음을 추가하여 버전을 업데이트하고 빌드 할 수 있습니다. 참고 :
PreferenceSpecifiers
설정과 일치 하도록 값을 변경하십시오 .PreferenceSpecifiers:2
는PreferenceSpecifiers
plist 파일 의 배열 아래에서 인덱스 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
-
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
답변
(이것은 내 참조를 위해 여기에 남겨 두십시오.) 그러면 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)"
}
답변
빌드 번호는 앱의 현재 상태를 나타내는 내부 번호입니다. 일반적으로 사용자가 직면하지 않으며 버전 번호와 달리 차이점 / 기능 / 업그레이드를 나타내지 않는다는 점에서 버전 번호와 다릅니다.
다음과 같이 생각하십시오.
- 빌드 (
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 페이지를 참조하십시오
답변
빌드 번호가 부동 소수점 값인 경우 위의 답변에서 빌드 번호를 자동 증가시키는 스크립트가 작동하지 않으므로 조금 수정했습니다.
#!/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"
답변
마케팅 릴리스 번호는 고객을위한 버전 번호 입니다. 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"
답변
훌륭한 답변을 주신 @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"
답변
다른 방법은 다음에서 버전 번호를 설정하는 것입니다 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];
}