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

StackOverflow https://stackoverflow.com/questions/877128

문제

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

도움이 되었습니까?

해결책 7

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

  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 Environment 변수와 같은 사전 처리기 지시문이 포함될 수 있습니다. 그래서 다음 지침을 추가하여 변수 KrevisionNumber를 참조 할 수있었습니다.

    #include "Revision.h"
    
  4. 또한 프로젝트가 Being Build에 꿀벌을 실행하기 위해 내 Xcode 대상에 사용자 정의 스크립트 빌드 단계를 추가했습니다.

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

그리고 그게 다야!

다른 팁

이전 답변 중 하나보다 훨씬 간단 할 수있는 또 다른 솔루션이 있습니다. 애플은 명령 줄 도구를 부른다 plistbuddy 대부분의 설치 업체 내부에서 Leopard에 포함 시켰습니다. /usr/libexec/PlistBuddy.

교체하고 싶기 때문에 VersionValue, 버전 값이 추출되었다고 가정합니다 $newVersion,이 명령을 사용할 수 있습니다.

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

SED 또는 정규 표현으로 바이올린이 필요하지 않으며,이 접근법은 매우 간단합니다. 참조 남자 페이지 자세한 지침. 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>
  • a 스크립트를 실행하십시오 위상을 빌드하고 이후에 이동하십시오 번들 자원을 복사하십시오 단계. 이 코드 추가 :

    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을 실제 앱 이름으로 바꾸고 선호도 후 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"

첨부 CFBundleVersion 추가 CFBundleShortVersionString. 다음과 같은 버전을 방출합니다.

편지를 통해$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)

다음은 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 구성표에서 공개 화살표를 클릭하세요.
  • 그런 다음 "사전 조치" 항목을 클릭하세요.
  • 더하기 기호를 클릭하고 "새 실행 스크립트 작업"을 선택합니다.
  • 쉘 값을 /bin/sh로 설정하십시오.
  • "빌드 설정 제공"을 프로젝트 대상으로 설정하십시오.
  • 텍스트 영역에 스크립트를 추가합니다.다음 스크립트가 저에게 효과적이었습니다.프로젝트 설정과 일치하도록 경로를 수정해야 할 수도 있습니다.

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

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

그러면 빌드/보관 프로세스 중에 설정 번들이 패키징되기 전에 스크립트가 올바르게 실행됩니다.설정 번들 Root.plist를 열고 프로젝트를 빌드/보관하면 이제 빌드 프로세스 시작 시 버전 번호가 업데이트되고 설정 번들이 올바른 버전을 표시하는 것을 볼 수 있습니다.

나는 당신이 내가 묘사 한 것과 비슷한 방식을 사용하여 이것을 할 수 있다고 생각합니다. 이 답변 ( 이 게시물).

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

마지막으로 대상으로 이동하여 실행 스크립트 빌드 단계를 만듭니다. 스크립트 단계를 실행하고 스크립트 텍스트 필드 내에서 스크립트에 붙여 넣는 것을 검사하십시오. 예를 들어, 현재의 Subversion Build와 함께 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

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

@ben Clayton 답변과 @luis ascorbe 및 @vahid amiri의 의견을 기반으로하는 나의 예제 :

참고 :이 접근법은 다음을 수정합니다 settings.bundle/root.plist 저장소 작업 사본의 파일

  1. 프로젝트 루트에 설정 번들을 추가하십시오. 이름을 바꾸지 마십시오
  2. setings.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. 프로젝트 (Target) 체계의 빌드, 사전 액션 섹션에 다음 스크립트 추가

    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. 현재 체계를 구축하고 실행하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top