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

내 애플리케이션의 설정 번들에 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 파일을 처리 (사전 처리)하고 소스 파일에 영향을주지 않고 개정 번호를 바꾸는 방법이 필요합니다.



답변

이전 답변보다 훨씬 간단 할 수있는 또 다른 솔루션이 있습니다. 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는 대화 형 모드로 전환되므로 변경 사항 저장을 결정하기 전에 여러 명령을 실행할 수 있습니다. 빌드 스크립트에서 작업하기 전에이 작업을 수행하는 것이 좋습니다.


답변

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

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

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

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


답변

@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에 있습니다.


답변

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에서 테스트


답변

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

#! /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>


답변

다른 답변은 한 가지 이유로 올바르게 작동하지 않습니다. 실행 스크립트 빌드 단계는 설정 번들이 패키지화 될 때까지 실행되지 않습니다. 따라서 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를 열고 프로젝트를 빌드 / 아카이브하면 빌드 프로세스 시작시 버전 번호가 업데이트되고 설정 번들에 올바른 버전이 표시됩니다.


답변

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. 기기 또는 시뮬레이터에서 앱이 실행되면 설정 앱을 열고 타사 앱 목록에서 앱을 선택합니다. 앱의 버전이 아래와 같이 표시되어야합니다.


출처