본문 바로가기

iOS

[iOS] iOS 앱의 버전 관리에 대해(앱 버전 및 빌드 버전)

앱 버전 넘버링

 앱 버전은 실제 사용자에게 보이는 Version이기 때문에, 일반적인 규칙에 따라 넘버링을 하는 것이 좋다.
앱 버전 넘버링은 보통 {MajorVersion}.{MinorVersion}.{Revision}의 형식으로 구성되는데, 예를 들어 1.2.25와 같은 형태를 가진다.
Major Version은 앱에서 큰 변화가 있거나 완전히 새로운 기능이 생기는 경우에 증가시킨다.
Minor Version은 주요 기능 하에서 부수적인 기능이나 수정이 이루어지는 등의 비교적 작은 변경점이 생겼을 때 증가시킨다.
Revision(Build Number)는 작은 버그 수정, 코드 개선 등의 작은 작업이 이뤄질 때 증가시킨다.

빌드 버전 넘버링

 빌드 버전은 개발자 내부적으로 확인하기 위한 버전 정보로, 사용자에게 보이지 않기 때문에 규칙에서 조금 더 자유롭다. 그러나 버전 관리의 효율성을 위해 일정한 규칙을 두고 빌드 버전을 넘버링하는 것이 좋다. 아래와 같은 몇 가지 규칙을 예로 들 수 있다.

 

1. 빌드 횟수
 단순히 1부터 빌드 횟수가 증가할수록 1씩 증가시켜 나가면 된다.

2. 빌드 날짜 + 횟수
 오늘 날짜가 2022년 8월 29일에 세번째 빌드이면 220829 + 3으로 하여
2208293이 될 것이다. 개인적으로 사용하기 편한 빌드 넘버링인 것 같다.

3. 버전과 동일
 말 그대로 버전과 동일하게 나가는 식이다.

앱 및 빌드 버전을 확인하고 코드에서 사용하기

 기본적으로 앱 버전과 빌드 버전은 프로젝트 파일에서 General -> Identity 항목에 들어가서 확인할 수 있다. 이러한 프로퍼티들은 프로젝트 파일에 info.plist의 형태로 저장되기 때문에 Bundle 클래스의 infoDictionary 프로퍼티를 사용하여 코드 상에서 얻어올 수도 있다.

 infoDictionary 프로퍼티는 앱 번들에서 info.plist에 저장된 정보들을 얻어올 수 있도록 받아오는 프로퍼티이다. 이를 활용하여 코드 상에서 버전을 얻어오는 방법은 아래와 같다.

if let value = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
	print(value) // 앱 버전
}
if let value = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
	return value // 빌드 버전
}

 

 이처럼 앱 버전과 빌드 버전을 코드상에서 불러올 수 있다면, 단순히 사용자의 편의를 위한 제공도 가능하며 앱스토어 버전과 비교하여 강제 업데이트를 불러오는 등의 작업을 할 수 있다.

Xcode의 Run Script를 활용하여 빌드 넘버링 자동화하기

 Xcode의 Build phase 탭에서 Run Script를 활용하여 넘버링을 자동화할 수도 있다. Run script가 빌드 시마다 자동으로 실행되기 때문에 원하는 코드를 넣어 build number를 바꿔주는 것이다. shell script로 작성된 코드는 다음과 같다. shell script에 대해서는 링크에 자세히 나와 있다.

buildDay=$(/usr/libexec/PlistBuddy -c "Print buildDay" "$INFOPLIST_FILE")
buildCount=$(/usr/libexec/PlistBuddy -c "Print buildCount" "$INFOPLIST_FILE")
today=$(date +%Y%m%d)

if [ x$buildDay == x ]; then
    buildDay=${today}
    buildCount=1
    buildNumber=${buildDay}${buildCount}

    /usr/libexec/PlistBuddy -c "Add :buildDay string $buildDay" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Add :buildCount string $buildCount" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

elif [ $buildDay != $today ]; then
    buildDay=${today}
    buildCount=1
    buildNumber=${buildDay}${buildCount}

    /usr/libexec/PlistBuddy -c "Set :buildDay $buildDay" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Set :buildCount $buildCount" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

else
    buildCount=$(($buildCount + 1))
    buildNumber=${buildDay}${buildCount}

    /usr/libexec/PlistBuddy -c "Set :buildDay $buildDay" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Set :buildCount $buildCount" "$INFOPLIST_FILE"
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

fi

 스크립트의 흐름은 먼저 buildDay라는 프로퍼티를 기준으로 진행된다. 먼저 buildDay라는 프로퍼티가 있는지 확인하고, 없으면 buildDay와 buildCount를 생성하고 buildNumber를 만들어준다. 만약 buildDay가 있는데 today와 다르다면 buildDay를 오늘로 설정하고 count를 1로 하여 buildNumber를 지정한다. 마지막으로 buildDay가 있고, today와 동일하면 count만 1을 증가시켜준다.

 위의 코드를 Run script에 넣어주고 빌드를 실행하면 자동으로 빌드 넘버가 갱신되는 모습을 확인할 수 있다.

 

참고

앱 버전 넘버링