Xcode 3으로 개발하고 최근 Xcode 4로 편집하기 시작한 앱이 있습니다. 대상 요약에는 식별자, 버전, 빌드, 장치 및 배포 대상 필드가있는 iOS 응용 프로그램 대상 양식이 있습니다. 버전 필드는 비어 있고 빌드 필드는 3.4.0입니다 (여전히 Xcode 3으로 편집 할 때의 앱 버전과 일치합니다).
내 질문은 :
버전과 빌드 필드의 차이점은 무엇입니까?
Xcode 4로 업그레이드 한 후 버전 필드가 비어있는 이유는 무엇입니까?
Xcode 3으로 개발하고 최근 Xcode 4로 편집하기 시작한 앱이 있습니다. 대상 요약에는 식별자, 버전, 빌드, 장치 및 배포 대상 필드가있는 iOS 응용 프로그램 대상 양식이 있습니다. 버전 필드는 비어 있고 빌드 필드는 3.4.0입니다 (여전히 Xcode 3으로 편집 할 때의 앱 버전과 일치합니다).
내 질문은 :
버전과 빌드 필드의 차이점은 무엇입니까?
Xcode 4로 업그레이드 한 후 버전 필드가 비어있는 이유는 무엇입니까?
답변:
애플은 재배치 / 재용도 분야에 해당합니다.
앞으로 응용 프로그램 대상의 정보 탭을 보면 "번들 버전 문자열, 짧은"을 버전 (예 : 3.4.0)으로, "번들 버전"을 빌드 (예 : 500 또는 1A500)로 사용해야합니다. ). 둘 다 표시되지 않으면 추가 할 수 있습니다. 그것들은 요약 탭에서 적절한 버전 및 빌드 텍스트 상자에 매핑됩니다. 그것들은 같은 값입니다.
정보 탭을 볼 때 마우스 오른쪽 버튼을 클릭하고 원시 키 / 값 표시를 선택 하면 실제 이름은 CFBundleShortVersionString
(버전) 및 CFBundleVersion
(빌드)입니다.
버전은 일반적으로 Xcode 3에서 사용했던 것처럼 보입니다. 버전 / 빌드 차이에 대해 어떤 수준으로 문의하고 있는지 잘 모르겠으므로 철학적으로 대답하겠습니다.
모든 종류의 체계가 있지만 인기있는 체계는 다음과 같습니다.
{MajorVersion}. {MinorVersion}. {개정}
그런 다음 빌드는 릴리스 또는 전체 제품 수명 동안의 총 빌드 수를 나타 내기 위해 별도로 사용됩니다.
많은 개발자가 빌드 번호를 0에서 시작하고 빌드 할 때마다 숫자가 하나씩 증가하여 영원히 증가합니다. 내 프로젝트에는 빌드 할 때마다 빌드 번호를 자동으로 늘리는 스크립트가 있습니다. 아래 지침을 참조하십시오.
Apple을 포함한 다른 개발자는 릴리스의 메이저 버전 + 마이너 버전 + 빌드 수로 구성된 빌드 번호를 갖습니다. 마케팅에 사용 된 값과 달리 실제 소프트웨어 버전 번호입니다.
Xcode 메뉴> About Xcode 로 이동 하면 버전 및 빌드 번호가 표시됩니다. 당신이 공격하면 더 많은 정보를 ... 버튼을 사용하면 서로 다른 버전의 무리를 볼 수 있습니다. 이후 추가 정보 ... 버튼이 엑스 코드 5를 제거하고,이 정보는에서 구할 소프트웨어> 개발자 의 섹션 시스템 정보 , 응용 프로그램 열어 사용할 수 애플 메뉴> 이 매킨토시에 관하여 > ... 시스템 보고서 .
예를 들어, Xcode 4.2 (4C139)입니다. 마케팅 버전 4.2는 빌드 메이저 버전 4, 빌드 마이너 버전 C 및 빌드 번호 139입니다. 다음 릴리스 (아마도 4.3)는 빌드 릴리스 4D 일 가능성이 높으며 빌드 번호는 0에서 다시 시작하여 증가합니다.
iPhone 시뮬레이터 버전 / 빌드 번호는 iPhone, Mac 등과 같은 방식입니다.
업데이트 : 요청에 따라 Xcode에서 앱을 빌드 할 때마다 빌드 번호를 읽고, 증가시키고, 앱의 {App}-Info.plist
파일에 다시 쓸 때마다 실행되는 스크립트를 만드는 단계가 있습니다 . 버전 / 빌드 번호를 Settings.bundle/Root*.plist
파일 에 쓰려면 선택적인 추가 단계가 있습니다 .
이 방법은 here 기사에서 확장되었습니다 .
Xcode 4.2-5.0에서 :
/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
)도 사용할 수 있습니다. 대신 그것을 사용하려면 먼저 변경해야 할 몇 가지가 있습니다.
이 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
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"
(이것은 내 참조를 위해 여기에 남겨 두십시오.) 그러면 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)"
}
alloc
/ init
문자열, 문자열을 유지하지만 풀어주지는 않습니다. 메소드에서 리턴 한 오브젝트에서는 일반적으로 편리한 메소드를 사용하여 문자열이 자동으로 해제되거나을 호출해야 autorelease
합니다. 다음 중 하나 return [NSString stringWithFormat:@"%@ build %@", version, build];
또는 return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
빌드 번호는 앱의 현재 상태를 나타내는 내부 번호입니다. 일반적으로 사용자가 직면하지 않으며 버전 번호와 달리 차이점 / 기능 / 업그레이드를 나타내지 않는다는 점에서 버전 번호와 다릅니다.
다음과 같이 생각하십시오.
CFBundleVersion
) : 빌드 수입니다. 일반적으로 1에서 시작하여 각 앱 빌드마다 1 씩 증가합니다. 최신 빌드를 비교할 수 있으며 코드베이스의 진행 감각을 나타냅니다. QA로 작업하고 올바른 빌드에 대해 버그가 기록되었는지 확인해야 할 때 이러한 기능은 압도적으로 가치가 있습니다.CFBundleShortVersionString
) :이 버전의 앱을 나타내는 데 사용하는 사용자 대면 번호입니다. 일반적으로 Major.minor 버전 체계 (예 : MyAwesomeApp 1.2)를 따라 유지 보수 업데이트가 작은 릴리스와 새로운 기능이 많은 릴리스를 사용자에게 알립니다.프로젝트에서이를 효과적으로 사용하기 위해 Apple은이라는 훌륭한 도구를 제공합니다 agvtool
. plist 변경을 스크립팅하는 것보다 훨씬 간단하므로 이것을 사용하는 것이 좋습니다. 빌드 번호와 마케팅 버전을 쉽게 설정할 수 있습니다. 스크립팅 할 때 특히 유용합니다 (예를 들어, 각 빌드에서 빌드 번호를 쉽게 업데이트하거나 현재 빌드 번호를 쿼리하기까지). 빌드 번호를 업데이트 할 때 SVN에 태그를 지정하는 것과 같은 이국적인 일을 할 수도 있습니다.
그것을 사용하려면 :
agvtool new-version 1
(빌드 번호를 1로 설정)agvtool new-marketing-version 1.0
(마케팅 버전을 1.0으로 설정)agvtool
많은 좋은 정보 는 man 페이지를 참조하십시오
마케팅 릴리스 번호는 고객을위한 버전 번호 입니다. 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];
}