내 애플리케이션의 설정 번들에 애플리케이션 버전 개정을 표시하려면 어떻게해야합니까?


91

내 애플리케이션의 설정 번들에 1.0.1 (r1243)과 같은 애플리케이션 버전 및 내부 개정을 포함하고 싶습니다.

Root.plist 파일에는 다음과 같은 조각이 포함되어 있습니다.

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

빌드 할 때 "VersionValue"문자열을 바꾸고 싶습니다.

내 저장소에서 버전 번호를 추출 할 수있는 스크립트가 있는데, 빌드 할 때 Root.plist 파일을 처리 (사전 처리)하고 소스 파일에 영향을주지 않고 개정 번호를 바꾸는 방법이 필요합니다.

답변:


69

이전 답변보다 훨씬 간단 할 수있는 또 다른 솔루션이 있습니다. Apple은 대부분의 설치 프로그램에 PlistBuddy 라는 명령 줄 도구를 번들로 제공하며 다음 위치에서 Leopard에 포함 시켰습니다./usr/libexec/PlistBuddy .

VersionValue추출 된 버전 값이 있다고 가정하고을 바꾸고 싶으므로 다음 $newVersion명령을 사용할 수 있습니다.

/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist

sed 또는 정규식을 조작 할 필요가 없습니다.이 접근 방식은 매우 간단합니다. 자세한 지침 은 man 페이지 를 참조하십시오 . PlistBuddy를 사용하여 속성 목록의 항목을 추가, 제거 또는 수정할 수 있습니다. 예를 들어, 내 친구가 Xcode에서 빌드 번호를 늘리는 것에 대해 블로그를 작성 했습니다. PlistBuddy를 사용하여 를 늘리는 를 작성했습니다.

참고 : plist에 대한 경로 만 제공하면 PlistBuddy는 대화 형 모드로 전환되므로 변경 사항 저장을 결정하기 전에 여러 명령을 실행할 수 있습니다. 빌드 스크립트에서 작업하기 전에이 작업을 수행하는 것이 좋습니다.


20
내 plist에서 버전 번호를 참조하는 올바른 방법을 찾는 데 시간이 좀 걸립니다. 제 경우에는 / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers : 0 : DefaultValue $ newversion"-다른 사람들에게 유용 할 것입니다.
JosephH

Quinn Taylor, JosephH, 귀하의 답변 덕분에 Settings.bundle에서 내 앱 버전 번호를 자동으로 구현할 수있었습니다. 둘 다 +1 ;-)
Niko 2012 년

7
사용자 정의 "스크립트 실행"빌드 단계에서 Root.plist에 대한 경로를 더 포함해야했습니다. / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers : 0 :의 DefaultValue $ NEWVERSION "
크리스 Vasselli

2
완전성을 위해, 여기 저에게 도움이 된 PListBuddy의 또 다른 접근 방식이 있습니다 : xcodehelp.blogspot.com/2012/05/…
koen

가장 올바른 방법입니다/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

내 게으른 사람의 해결책은 내 애플리케이션 코드에서 버전 번호를 업데이트하는 것이 었습니다. Root.plist에 기본 (또는 공백) 값이있을 수 있으며 시작 코드의 어딘가에 있습니다.

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

유일한 문제는 업데이트 된 버전이 설정 패널에 표시 되려면 앱을 한 번 이상 실행해야한다는 것입니다.

예를 들어 앱이 실행 된 횟수에 대한 카운터 또는 기타 흥미로운 정보를 업데이트 할 수 있습니다.


9
사용자가 앱을 시작 하기 전에 설정으로 이동하는 경우를 제외하고는 작동 합니다.
Moshe

9
@Moshe 사실은,하지만 당신은 단순히 .plist 파일 내에서 '아직 출시되지 않음'같은 아마 뭔가 기본값을 지정할 수 있습니다, 우아하게이 문제를 처리하는
카를로스 P

1
대부분의 개발자 가 동일한 값을 설정 CFBundleShortVersionString하고 있지만 실제로는 Apple이 출시 버전 을 고려하기 를 바라는 것이며, 이는 사용자에게 보여줄 것입니다. 내부 버전 번호 일 수 있으며 사용자에게 표시하지 않아야합니다 (다른 경우).CFBundleVersionCFBundleShortVersionStringCFBundleVersion
Nate

3
내가 뭔가를 놓치고 있습니까? 이것이 바로 제가하는 일이지만 값은 변경되지 않습니다. 내가 읽기 전용이라고 생각하는 Title 속성을 사용하지 않습니까?
samson

2
응용 프로그램을 업데이트 할 때 또 다른 문제가 있습니다. 설정 번들은 업데이트 된 애플리케이션이 적어도 한 번 실행될 때까지 이전 빌드 버전을 계속 표시합니다.
Legoless

62

@Quinn의 답변에 따라 여기에 전체 프로세스와 작업 코드가 있습니다.

  • 앱에 설정 번들을 추가합니다. 이름을 바꾸지 마십시오.
  • 텍스트 편집기에서 Settings.bundle / Root.plist를 엽니 다.

내용을 다음으로 바꿉니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • 스크립트 실행 빌드 단계를 생성하고 번들 리소스 복사 단계 이후로 이동합니다 . 이 코드를 추가하십시오.

    cd "${BUILT_PRODUCTS_DIR}"
    buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" )
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
    
  • MyAppName을 실제 앱 이름으로 바꾸고 PreferenceSpecifiers 뒤의 1을 설정에서 버전 항목의 색인으로 바꿉니다. 위의 Root.plist 예제는 인덱스 1에 있습니다.


나는이 갈 수있는 가장 좋은 방법이라고 생각
토니

나는 이것을 시도했고 내 설정 번들에서 제목 값이 변경되는 것을 봅니다. 제목은 InAppSettingsKit에 표시되지만 값은 초기 버전에서 변경되지 않습니다. 제목은 설정 앱에 표시되지 않습니다. 나는 포기 그리고 난 그냥 대화를 팝업거야 때 '메뉴의'정보 '사용자가 선택
bugloaf

이 방법을 사용할 때 설정은 읽기 전용이 아닙니다. 즉, settings.app에서 버전 번호 설정을 탭하여 편집 할 수 있습니다.
motionpotion 2014 년

8
나는 그의 답변에 따라 그것을 리메이크 있도록 bash는 스크립트 @ 벤 - 클레이튼 넣어이, 나를 위해 작동하지 않았다, 여기있다 :buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
루이스 Ascorbe

1
${INFOPLIST_PATH}info plist 경로에 사용할 수 있습니다
Tomer Even

24

Ben Clayton의 plist https://stackoverflow.com/a/12842530/338986 사용

Run script뒤에 다음 스 니펫으로 추가하십시오 Copy Bundle Resources.

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

추가 CFBundleVersionCFBundleShortVersionString. 다음과 같은 버전을 내 보냅니다.

$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist 대신에 편지를 쓰면 $SRCROOT몇 가지 이점이 있습니다.

  1. 저장소의 작업 복사본에서 파일을 수정하지 않습니다.
  2. Settings.bundle에서 경로를 대소 문자로 지정할 필요가 없습니다 $SRCROOT. 경로는 다를 수 있습니다.

Xcode 7.3.1에서 테스트


1
프로젝트 체계의 Build, Pre-actions 섹션에 스크립트를 추가하는 경우 이것이 가장 좋은 IMO입니다. Andy의 대답을보십시오.
Vahid Amiri

2
이것은 나를 위해 일하고 있습니다. "DefaultValue"를 사용자에 맞게 변경하는 것을 잊지 마십시오. 예를 들어 바닥 글을 변경하여 "FooterText"를 사용했습니다. 또한 "PreferenceSpecifiers"뒤의 번호를 변경하여 plist의 항목과 연관되도록해야합니다.
Richard Witherspoon

12

예를 바탕으로 여기에 , 여기에 내가 자동으로 설정을 번들 버전 번호를 업데이트하기 위해 사용하고 스크립트는 다음과 같습니다

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle
settings_key = 'version_preference' # the key of your settings version

# these are used for testing only
info_path = '/Users/mrwalker/developer/My_App/Info.plist'
settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist'

# these environment variables are set in the XCode build phase
if 'PRODUCT_SETTINGS_PATH' in os.environ.keys():
    info_path = os.environ.get('PRODUCT_SETTINGS_PATH')

if 'PROJECT_DIR' in os.environ.keys():
    settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path)

# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist['CFBundleVersion']

# print 'project_bundle_version: '+project_bundle_version

# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
  for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = project_bundle_version

# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)

Settings.bundle에있는 Root.plist는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

매우 유용합니다-Python에서 PlistBuddy를 실행하는 데 문제가 있습니다. 사용을 생각하지 않았을 것입니다 NSDictionary(그리고 plist 파일에 쉽게 액세스 할 수 있다는 사실도 몰랐습니다)
Dov

감사합니다. 하나의 수정 사항-지금 가지고있는 것처럼 builddir이 아닌 소스를 변경합니다. 즉, 장치 또는 시뮬레이터에 표시되는 내용은 항상 실제 빌드 버전 뒤에있는 하나의 빌드 버전이됩니다. 이 문제를 해결하기 위해 먼저 소스를 반복 한 다음 builddir도 반복하도록 스크립트를 수정했습니다. settings_path_build = os.path.join (os.environ.get ( 'TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... 그리고 또한 나는 githash를 추가합니다 :gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod 2014

8

다른 답변은 한 가지 이유로 올바르게 작동하지 않습니다. 실행 스크립트 빌드 단계는 설정 번들이 패키지화 될 때까지 실행되지 않습니다. 따라서 Info.plist 버전이 2.0.11이고이를 2.0.12로 업데이트 한 다음 프로젝트를 빌드 / 보관하면 설정 번들은 여전히 ​​2.0.11로 표시됩니다. 설정 번들 Root.plist를 열면 빌드 프로세스가 끝날 때까지 버전 번호가 업데이트되지 않음을 알 수 있습니다. 프로젝트를 다시 빌드하여 설정 번들을 올바르게 업데이트하거나 대신 빌드 전 단계에 스크립트를 추가 할 수 있습니다.

  • XCode에서 프로젝트 대상의 구성표를 편집하십시오.
  • BUILD 구성표에서 공개 화살표를 클릭하십시오.
  • 그런 다음 "사전 조치"항목을 클릭하십시오.
  • 더하기 기호를 클릭하고 "New Run Script Action"을 선택합니다.
  • 쉘 값을 / bin / sh로 설정하십시오.
  • "빌드 설정 제공"을 프로젝트 대상으로 설정하십시오.
  • 텍스트 영역에 스크립트를 추가하십시오. 다음 스크립트가 저에게 효과적이었습니다. 프로젝트 설정과 일치하도록 경로를 수정해야 할 수 있습니다.

    versionString = $ (/ usr / libexec / PlistBuddy -c "CFBundleVersion 인쇄" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist"-c "set PreferenceSpecifiers : 0 : DefaultValue $ versionString"

이렇게하면 빌드 / 아카이브 프로세스 중에 설정 번들이 패키징되기 전에 스크립트가 올바르게 실행됩니다. 설정 번들 Root.plist를 열고 프로젝트를 빌드 / 아카이브하면 빌드 프로세스 시작시 버전 번호가 업데이트되고 설정 번들에 올바른 버전이 표시됩니다.


감사합니다. 솔루션 만 올바른 빌드 버전을 표시합니다. 두 번 빌드하는 데 필요한 다른 솔루션.
Boris Y.

이것은 여전히 ​​Xcode 10.0을 사용하는 두 번째 빌드가 필요했습니다
Patrick

@Patrick iOS 설정 앱은 때때로 이전 정보를 유지합니다. 변경 사항을 확인하려면 설정 앱을 종료하고 다시 시작해야합니다.
Andy

1
BTW,이 스크립트를 추가하는 더 간단한 방법을 찾았습니다. 프로젝트 대상의 빌드 단계 탭으로 이동하여 "+"아이콘을 클릭하십시오. "New Run Script Phase"를 선택하고 거기에 스크립트 코드를 추가합니다. 이것이 핵심입니다. 새 실행 스크립트를 클릭하여 빌드 단계 목록의 대상 종속성 아래에서 소스 컴파일 이전으로 끌어옵니다. 이것은 Pre-build 스크립트와 동일하게 작동하며 찾기가 더 쉽습니다.
Andy

감사합니다 @Andy, 빌드 단계 탭에 추가하는 솔루션이 완벽하게 작동했습니다.
Patrick

8

Xcode 11.4에서는 다음 단계를 사용하여 애플리케이션의 설정 번들에 앱 버전을 표시 할 수 있습니다.


설정 $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION) 변수

참고 : Info.plist 에 및 키에 대한 $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)변수가 나타나면 다음 단계를 건너 뛰고 다음 섹션으로 건너 뛸 수 있습니다.Bundle version string (short)Bundle version

  1. Xcode 프로젝트를 엽니 다.
  2. 열기 프로젝트 네비게이터 (cmd1 )를 설정을 표시 할 프로젝트를 선택한 다음 앱 대상을 선택합니다.
  3. 일반 선택 탭을 하십시오.
  4. 에서 신원 섹션에서 변경 버전의 새로운 값 (예에 필드 내용을 0.1.0)하고 변경 빌드 새로운 값 (예에 필드 내용을 12). 이 두 가지 변경 사항은 Info.plist 파일에 $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)변수를 생성 합니다.

설정 번들 생성 및 구성

  1. 에서 프로젝트 네비게이터 를 선택합니다.
  2. 선택 파일 > 새로 만들기 > 파일 ... (cmdN ).
  3. iOS 선택 탭을 하십시오.
  4. 선택 설정 번들리소스 섹션을 클릭 한 다음 다음을 하고 만들기 .
  5. Root.plist를 선택 하고 소스 코드로 엽니 다. 해당 내용을 아래 코드로 바꿉니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string></string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

실행 스크립트 추가

  1. 프로젝트 네비게이터 에서 프로젝트 를 선택합니다.
  2. 앱 대상을 선택하십시오.
  3. 빌드 단계 탭을 선택합니다 .
  4. + > 새 실행 스크립트 단계를 클릭합니다 .
  5. 번들 리소스 복사 섹션 위 어딘가에 새 단계를 끌어다 놓습니다 . 이런 식으로 응용 프로그램을 컴파일하기 전에 스크립트가 실행됩니다.
  6. 새로 추가 된 스크립트 실행 단계를 열고 다음 스크립트를 추가합니다.
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

앱 시작

  1. cmdR장치 또는 시뮬레이터 에서 제품 ( )을 실행합니다 .
  2. 기기 또는 시뮬레이터에서 앱이 실행되면 설정 앱을 열고 타사 앱 목록에서 앱을 선택합니다. 앱의 버전이 아래와 같이 표시되어야합니다.


출처


이것은 나를 위해 오류를 던졌습니다Set: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H

2
이것은 나를 위해 일했습니다./usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H

감사. 이것은 나를위한 세상입니다. 하지만 내 이름은 Settings-Watch.bundle이고 제거되었습니다.($build)
Kurt Lane

대박! 나를 위해 여기에서 주요 도움말은 @Ben Clayton의 답변을 사용했지만 지적한대로 $ MARKETING_VERSION 및 $ CURRENT_PROJECT_VERSION을 사용하도록 실행 스크립트를 수정하는 것이 었습니다. 이 버전 번호는 이제 실제로 Info.plist에 직접 저장되지 않기 때문에 필요했습니다. 따라서 실행 스크립트에서 Info.plist를 읽는 것은이 경우에 도움이되지 않습니다 (지금은 Xcode 기본값 임).
Mete

오 또한 사소한 세부 사항이지만 실행 스크립트가 불필요하게 재정의됩니다 $MARKETING_VERSION-> $version- $MARKETING_VERSIONPlistBuddy 명령 에 직접 입력하여 한 줄로 만들 수 있습니다.
Mete

3

나는 pListcompiler ( http://sourceforge.net/projects/plistcompiler ) 오픈 소스 porject 를 사용하여 내가 원하는 것을 할 수 있었습니다.

  1. 이 컴파일러를 사용하면 다음 형식을 사용하여 .plc 파일에 속성 파일을 작성할 수 있습니다.

    plist {
        dictionary {
            key "StringsTable" value string "Root"
            key "PreferenceSpecifiers" value array [
                dictionary {
                    key "Type" value string "PSGroupSpecifier"
                    key "Title" value string "AboutSection"
                }
                dictionary {
                    key "Type" value string "PSTitleValueSpecifier"
                    key "Title" value string "Version"
                    key "Key" value string "version"
                    key "DefaultValue" value string "VersionValue"
                    key "Values" value array [
                        string "VersionValue"
                    ]
                    key "Titles" value array [
                        string "r" kRevisionNumber
                    ]
                }
            ]
        }
    }
    
  2. 여기 brad-larson 에서 설명한대로 .h 파일로 저장소 개정을 추출하는 사용자 지정 실행 스크립트 빌드 단계가 있습니다 .

  3. plc 파일에는 #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode 환경 변수와 같은 전 처리기 지시문이 포함될 수 있습니다. 그래서 다음 지시문을 추가하여 kRevisionNumber 변수를 참조 할 수있었습니다.

    #include "Revision.h"
    
  4. 또한 프로젝트가 빌드 될 때마다 plcompiler를 실행하기 위해 xcode 대상에 사용자 지정 스크립트 빌드 단계를 추가했습니다.

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

그리고 그게 다였습니다!


plist 파일의 단일 값을 바꾸는 작업이 많은 것 같네요 ... plist를 빌드 할 때 변수에 액세스 할 수 있다는 것은 개념적으로 멋지지만 plist 파일 용 도구 빌드를 사용하는 것은 훨씬 쉽습니다. 내 대답에 PlistBuddy를 설명합니다. 한번 시도해보세요!
Quinn Taylor

3

@Ben Clayton 답변과 @Luis Ascorbe 및 @Vahid Amiri의 의견을 기반으로 한 내 작업 예 :

참고 :이 접근 방식 은 저장소의 작업 복사본에서 Settings.bundle / Root.plist 파일을 수정 합니다.

  1. 프로젝트 루트에 설정 번들을 추가합니다. 이름을 바꾸지 마십시오

  2. Settings.bundle / Root.plist를 SourceCode로 엽니 다.

    내용을 다음으로 바꿉니다.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. 프로젝트 (대상) 체계의 빌드, 사전 작업 섹션에 다음 스크립트를 추가합니다.

    version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
    build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. 현재 구성표 작성 및 실행


2

위의 답변은 나를 위해 작동하지 않았으므로 맞춤 스크립트를 만들었습니다.

이렇게하면 Root.plist의 항목이 동적으로 업데이트됩니다.

아래 실행 스크립트를 사용하십시오. xcode 10.3에서 확실히 확인됩니다.

"var buildVersion"은 제목에 표시 할 버전입니다.

식별자 이름은 settings.bundle Root.plist의 제목에 대한 아래 "var 버전"입니다.

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

Root.plist의 예제 항목

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

작업 샘플 Root.plist 항목


1

나는 이 답변 에서 설명한 것과 비슷한 방식으로 이것을 할 수 있다고 믿습니다 ( 이 게시물을 기반으로 함 ).

먼저 VersionValue를 $ {VERSIONVALUE}로 이름을 변경하여 Xcode 내에서 변수로 만들 수 있습니다. versionvalue.xcconfig라는 파일을 만들고 프로젝트에 추가합니다. 응용 프로그램 대상으로 이동하여 해당 대상에 대한 빌드 설정으로 이동합니다. 사용자 정의 빌드 설정으로 VERSIONVALUE를 추가해야한다고 생각합니다. 해당 창의 오른쪽 아래 모서리에서 기준 값을 "versionvalue"로 변경합니다.

마지막으로 대상으로 이동하여 스크립트 실행 빌드 단계를 만듭니다. 스크립트 실행 단계를 검사하고 스크립트 텍스트 필드에 스크립트를 붙여 넣습니다. 예를 들어, 현재 Subversion 빌드로 내 BUILD_NUMBER 설정에 태그를 지정하는 스크립트는 다음과 같습니다.

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

프로젝트 내에서 이러한 값이 변경 될 때 변수를 대체하는 트릭을 수행해야합니다.


Info.plist 파일에 버전 번호를 포함하려는 경우 작동합니다. 그러나 다른 plist 파일 (예 : Settings.bundle에있는 Root.plist 파일)에서는 작동하도록 만들 수 없습니다. 이 기능을 활성화하는 데 사용할 수있는 빌드 설정이 있습니까?
Panagiotis Korros

0

나에게 이것은 가장 쉬운 해결책이었습니다.

번들 리소스 복사 단계 전에 새 스크립트 빌드 단계 추가

껍질: /usr/bin/env python

함유량:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_VERSION') + ")"

# Reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = version_string

# Save new settings
settings_plist.writeToFile_atomically_(settings_path, True)

0

Xcode 12.2를 사용하는 신속한 프로젝트에 사용해야하는 변수입니다.

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build="$CURRENT_PROJECT_VERSION"

/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:FooterText Version $version" "$CODESIGNING_FOLDER_PATH/Settings.bundle/ServerURLSettings.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:FooterText Version $version($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/DeveloperSettings.plist"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.