CFBundleVersion 및 CFBundleShortVersionString에 어떤 값을 사용해야합니까?


98

이것은 내 첫 iOS 앱 제출이며 내 앱이 거부되는 것을 원하지 않습니다.

이것은 Apple Docs에서 가져온 것입니다.

CFBundleVersion (문자열-iOS, OS X)은 번들의 반복 (출시 또는 미출시)을 식별하는 번들의 빌드 버전 번호를 지정합니다. 빌드 버전 번호는 첫 번째 정수가 0보다 큰 음수가 아닌 세 개의 마침표로 구분 된 정수로 구성된 문자열이어야합니다. 문자열에는 숫자 (0-9) 및 마침표 (.) 문자 만 포함되어야합니다. 선행 0은 각 정수에서 잘리고 무시됩니다 (즉, 1.02.3은 1.2.3과 동일 함). 이 키는 지역화 할 수 없습니다.

CFBundleShortVersionString (문자열-iOS, OS X)은 앱의 릴리스 된 반복을 식별하는 번들의 릴리스 버전 번호를 지정합니다. 릴리스 버전 번호는 마침표로 구분 된 세 개의 정수로 구성된 문자열입니다. 첫 번째 정수는 새로운 기능 또는 주요 변경 사항을 구현하는 개정과 같이 앱의 주요 개정을 나타냅니다. 두 번째 정수는 덜 눈에 띄는 기능을 구현하는 개정을 나타냅니다. 세 번째 정수는 유지 관리 릴리스를 나타냅니다.

이 키의 값은 앱의 반복 (출시 또는 미출시)을 식별하는 'CFBundleVersion'의 값과 다릅니다. 이 키는 InfoPlist.strings 파일에 포함하여 지역화 할 수 있습니다.

하지만 조금 이상해 보입니다. 이에 대한 나의 해석은 두 값을 동일하게 두는 것입니다.

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

누군가 내가 넣어야하는 것을 100 % 확인할 수 있습니까?


1
이에 따라 CFBundleShortVersionString을 현지화 할 수 있습니다. 그러나 마침표로 구분 된 세 개의 정수 여야한다면 어떤 현지화가 가능할까요?
Rick

@Rick 아랍어와 같이 실제로 숫자가 다른 언어로 변환 할 수 있다는 뜻이라고 생각합니까?
shiser

@shiser 현명하게 말하면 "아라비아 숫자"는 실제로 우리가 서구 세계에서 사용하는 숫자이며 대부분의 다른 장소에서도 사용됩니다. 그러나 나는 당신이 의미하는 바를 이해합니다. 그리고 "아라비아 숫자"를 사용하지 않는 아라비아 세계의 일부가 있습니다. en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
여기에 또 다른 대답이 있습니다. stackoverflow.com/q/21125159/419348
AechoLiu

답변:


77

다음과 같이 생각해보십시오. "짧은 버전"( CFBundleShortVersionString)은 공개 버전 번호입니다. "버전"( CFBundleVersion)은 공개 "짧은 버전"보다 훨씬 더 자주 변경 될 수있는 내부 버전 번호에 가깝습니다. 개인적으로 나는 두 가지 모두에 동일하게 사용하지만 많은 사람들이 모든 빌드에서 "버전"을 업데이트합니다. 어느 쪽이든 일반적으로 Apple에 출시 할 때 "짧은 버전"을 업데이트합니다. "버전"을 업데이트하는 빈도는 귀하와 귀하의 필요에 달려 있습니다.


14
번들 버전 (CFBundleVersion)은 숫자 적으로 이전 앱의 번들 버전을 초과해야합니다. 그렇지 않으면 App Store에 제출할 때 오류가 발생합니다. stackoverflow.com/questions/4933093/…을 참조하십시오 .

3
Phil이 위에서 말한 것과 비슷하게, 요즘에는 실패한 (App Store에서 승인하지 않은) 빌드 를 다시 제출 하면 지금 제출할마다 CFBundleVersion을 올려야 하는 것처럼 보이 므로 항상 완벽하지 않으면이 수치가 달라질 수 있습니다. 또는 App Store에 성공적으로 제출하는 데 필요한 변경 사항이있을 때 공개 (CFBundleShortVersionString) 버전 번호를 변경해도 상관 없습니다.
likethesky

106

CFBundleShortVersionString 은 앱 의 버전 을 제공합니다 . 일반적으로 앱을 App Store에 게시 할 때마다 증가합니다. 애플리케이션의 App Store 페이지에 대한 "버전"섹션에 표시되는 버전입니다.

CFBundleVersion 은 개발 및 테스트, 즉 "기술적"목적에 사용되는 빌드 번호 를 제공 합니다. 최종 사용자는 빌드 번호에 거의 관심이 없지만 개발 중에 각 빌드에서 개발되고 수정되는 내용을 알아야 할 수도 있습니다. 이는 일반적으로 내부 릴리스가 반복 될 때마다 증가합니다. Jenkins와 같은 지속적 통합 도구를 사용하여 각 빌드의 빌드 번호를 자동으로 늘릴 수 있습니다.

버전 및 빌드 번호

두 숫자는 서로 의존하지 않지만 혼동을 피하기 위해 병렬로 유지하는 것이 좋습니다. 앱이 App Store 검토를 통과하면 게시 여부에 관계없이 Phil 및 likeTheSky가 언급 한 빌드 번호를 늘려야합니다.

사용 사례 : 제출할 준비가 된 잘 테스트 된 빌드가 있다고 가정 해 보겠습니다. 버전 번호는 1.0.0 이고 빌드 번호는 1.0.0.32 입니다. 앱을 제출 한 후에는 버전을 1.0.1 로 업데이트 하고 빌드 번호를 1.0.1.0 으로 업데이트해야합니다 .


4
그래서, CFBundleVersion이 마침표로 구분 된 값인 " 3 " 에 대한 문서 (질문에서 인용)의 해당 비트를 무시하는 것이 안전 합니까?
big_m

나는 당신에게 달려 있다고 생각합니다. 릴리스를 자주 게시하지 않거나 빈번한 테스트주기를 통해 버그 수정을 엄격하게 따를 필요가없는 경우 둘 다 3 자리 숫자를 사용하는 것이 좋습니다.
Yunus Nedim Mehel

앱 스토어 빌드의 경우 CFBundleVersion이 0이 될 수 있습니까? 애플은 그것을 거부할까요?
kraftydevil

3
예, 구두점과 함께 3 자리 숫자 이외의 값을 사용할 수 있습니다. 201606070620배송 iOS 앱에서 와 같이 날짜-시간 값을 사용했습니다 .
바질 우르 큐

3
@BasilBourque, 지침을 따르지 않으면 인앱 구매를 사용하면 문제가 발생할 수 있습니다. Technical Note 2413
DanSkeel을

16

rmaddy대답 이 맞습니다. 두 가지 생각을 더 추가하겠습니다.

세 번째 버전 번호

앱 정의의 일부로 iTunesConnect 웹 사이트에 지정된 세 번째 버전 번호를 알고 있어야합니다. 이 번호가 Xcode의 두 번호와 다른 경우 Apple은 경고를 표시합니다. 경고를 무시할 수 있습니다 ( "오류"가 아님).

날짜-시간 (버전)

또한 구두점과 함께 세 개의 숫자를 사용할 필요가 없습니다. 전통적으로 첫 번째 숫자의 변화가 일반적으로 호환성에 영향을 미치는 일종의 극적인 변화를 나타내는 일부 앱에서는 의미가있을 수 있습니다.

다른 앱의 경우 ISO 8601 표준 형식 스타일 (YYYYMMDDHHMM) 의 날짜-시간 값을 사용할 수 있습니다 . 예 : 201606070620. 연-월-일-시간-분의 순서는 계속 증가하는 숫자를 렌더링하며, 패딩 0으로 인해 항상 동일한 길이이며, 알파벳순으로 정렬 될 때도 시간순입니다.

iOS 7, 8, 9에서 작동하는 iOS 앱에서이 스타일의 버전 번호를 성공적으로 사용했습니다.

이 값의 생성을 자동화 할 수도 있습니다. 프로젝트의에서 Target> Build Phases> Run Script패널 :

  1. Shell필드에 지정하십시오 ./bin/sh
  2. 아래에 표시된 다음 5 줄 스크립트를 붙여 넣습니다.
  3. (선택 사항) 체크 Show environment variables in build log박스를 선택합니다.
  4. 확인란을 선택 취소하십시오 Run script only when installing.

빌드 할 때마다 UTC 시간대 의 현재 날짜-시간 이 캡처됩니다. -u스크립트 의 플래그는 현재 기본 시간대가 아닌 UTC를 사용합니다. 일반적으로 프로그래머와 시스템 관리자가 현지 시간대가 아닌 UTC를 사용하고 생각하는 것이 가장 좋습니다.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

또는 1.2.3버전 번호에 대한 관습 과 빌드 번호에 날짜-시간을 사용하여 하이브리드를 수행 하십시오. 하이브리드를 수행하려면 앞에가 있는 CFBundleShortVersionString줄을 주석 처리 하면 #됩니다.


8

나에게 가장 현명한 방법 CFBundleShortVersionString은 실제 버전 번호에 버전 번호 (예 :) 를 사용한 다음 빌드 번호 (예 CFBundleVersion:)를 사용하여 App Store에 제출하는 것입니다. 따라서 문제가 없어서 다시 제출하지 않는 한이 숫자는 항상 1입니다. 새 릴리스의 경우 이전 버전이 TestFlight 테스트 또는 검토 중 문제가있는 경우 1로 재설정합니다.

빌드 번호는 특정 릴리스에 대해 제공하는 각 제출의 이름을 지정하는 방법을 제공합니다. 위의 정의에 설명 된대로 앱의 특정 버전에 대해 제공하는 모든 빌드 모음을 해당 버전의 '릴리스 트레인'이라고합니다. iOS 앱의 경우 빌드 번호는 각 릴리스 트레인 내에서 고유해야 하지만 서로 다른 릴리스 트레인에서 고유 할 필요는 없습니다 [제 강조점]. 즉, iOS 앱의 경우 원하는 경우 다른 릴리스 트레인에서 동일한 빌드 번호를 다시 사용할 수 있습니다.

에서 버전 번호 및 빌드 번호 : 기술 참고 TN2420 .


1
이 페이지의 다른 답변에 제시된 해석을 확인하는 공식 참조를 제공하는 답변을 보니 반갑습니다.
user2067021

6

내가 사용 CFBundleVersion을 위한 내부 빌드 나타 내기 위해 CFBundleShortVersionString을 . 테스트 비행을 사용하여 테스터를위한 빌드를 제출하므로 이들 간의 차이가 매우 유용했습니다.

애플 문서는 CFBundleVersion가 "로 구성된 문자열이어야한다고 말했습니다 3 음이 아닌, 시대 구분의 정수"하지만 실제로이 될 수 MORE THAN (위의 대답 쇼 등) 3 부. 내 개발 빌드를 나타내는 데 사용합니다. 내 CFBundleShortVersionString이 1.0.0이고 CFBundleVersion에 1.0.0.11을 사용하여 릴리스 1.0.0의 11 번째 빌드임을 나타낼 수 있습니다.

앱 스토어에 제출 된 각 CFBundleVersion이 이전보다 커야합니다. 그렇지 않으면 오류 ITMS-90478 : "잘못된 버전입니다. 새 빌드 제출을 위해 최신 버전이 닫 혔기 때문에 버전이"xxx "인 빌드를 가져올 수 없습니다. 선택하십시오. 다른 버전 번호. "

CFBundleShortVersionString 은 세 부분 만 포함 할 수 있습니다. 그렇지 않으면 오류 ITMS-90060이 표시됩니다. Info.plist 파일의 키 CFBundleShortVersionString 'xxx'값 은 최대 3 개의 음이 아닌 정수 로 구성된 마침표로 구분 된 목록이어야합니다 . "

그만큼 3 수의 예에 버전 번호 쇼 바질 우르 큐가 언급 한, iTunesConnect는 일이 복잡받을 수있는 곳입니다.

CFBundleShortVersionString 과 다른 iTunesConnect 번호를 사용합니다. 앱 스토어에 앱을 처음 제출했을 때 이미 많은 내부 릴리스가 있기 때문입니다. 그래서 iTunesConnect 번호에는 1.0을, CFBundleShortVersionString에는 5.x를 사용했습니다. 앱 스토어의 다음 릴리스에서는 앱 스토어에 최신 버전이 있는지 확인하는 기능을 제공했고, iTunesConnect 번호 만받을 수 있기 때문에 (사용 http://itunes.apple.com/lookup?bundleId=) 문제가 있다는 것을 깨달았으므로 비교하기 전에 몇 가지 계산을해야합니다. CFBundleShortVersionString 번호로.

iTunesConnect 번호를 CFBundleShortVersionString으로 사용하여 문제를 해결하려고했지만 오류가 발생했습니다. 오류 ITMS-90062 : "이 번들이 잘못되었습니다. Info.plist 파일의 키 CFBundleShortVersionString [xxx]에 대한 값은 그보다 높은 버전을 포함해야합니다. 이전에 승인 된 버전 [xxx]. "

그래서 나는 그것들을 항상 동일하게 만들 것을 제안 할 것입니다.


5

CFBundleVersion에서 각 필드의 최대 개수는 얼마입니까?

앱에서 CFBundleVersion을 1.1.1로 설정하고 "lsregister -dump"에서 버전의 16 진수 값을 살펴보면 첫 번째 필드의 최대 값이 (2 ^ 22) -1 또는 4194303이고 최대 값이 두 번째 및 세 번째 필드의 값은 (2 ^ 21) -1 또는 2097151입니다.

3 개 필드의 합은 최대 64 비트입니다.

이것은 날짜와 시간을 기준으로 CFBundleVersion을 사용하는 사람들에게 의미가 있습니다.

첫 번째 필드를 YYYYMMDD로 설정했습니다. 이것은 항상 최대 허용 버전보다 크며, 최소한 여러 버전이 설치되어 있고 'open -a Appname'과 같은 것을 사용하고있을 때 Launch Services가 실행할 앱 버전을 결정할 때 예측할 수없는 결과를 초래했습니다. '명령 줄에서.

이것을 널리 퍼뜨려주세요. 나는 많은 사람들이 이것에 얽매이지 않을 것이라고 확신합니다.


네 번째 필드가 추가되면 (1.1.1.20191201) 어떤 작업이 수행되고 대신 사용하게되었는지 기억하십니까? 나는 정말로 애플이 안드로이드가 여기에서 한 것과 같은 숫자 값을 사용하기를 바랍니다. PS를 찾아 주셔서 감사합니다!
spacesuitdiver

나는 제한이 여기 에 문서화되어 있고 여기에 언급 된 것보다 훨씬 더 제한적 이라고 생각합니다 .
saagarjha 2010

3

현재 상태에 대한 Apple 문서CFBundleVersion [강조] :

번들의 반복을 식별하는 빌드 버전입니다.

...

이 키는 10.14.1과 같이 마침표로 구분 된 1 ~ 3 개의 정수 로 구성된 기계 판독 가능 문자열 입니다. 문자열에는 숫자 (0-9)와 마침표 만 포함될 수 있습니다.

...

더 많은 정수를 포함 할 수 있지만 시스템은이를 무시합니다.

에 대한 CFBundleShortVersionString [강조 광산]

번들의 릴리스 또는 버전 번호입니다.

...

이 키는 번들 버전대해 사용자에게 표시되는 문자열입니다 . 필수 형식은 10.14.1과 같이 마침표로 구분 된 세 개의 정수 입니다. 문자열에는 숫자 (0-9)와 마침표 만 포함될 수 있습니다.

CFBundleVersion각 빌드 (또는 TestFlight의 모든 릴리스)에 대해 자동으로 증가 하고 변경할 때마다 0으로 재설정하는 것이 좋습니다 CFBundleShortVersionString.

에서 사용자 표시 버전을 업데이트하려면 명시 적으로 계획하거나 일관된 방법을 고안해야합니다 CFBundleShortVersionString.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.