응용 프로그램의 설정 번들에 응용 프로그램 버전 버전을 표시하려면 어떻게 해야 합니까?
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를 사용하여 속성 목록의 항목을 추가, 제거 또는 수정할 수 있습니다.예를 들어, 제 친구가 PlistBuddy를 사용하여 Xcode에서 빌드 번호를 증가시키는 것에 대해 블로그에 올렸습니다.
참고: Plist에 경로만 제공하면 PlistBuddy가 대화형 모드로 전환되므로 변경 내용을 저장하기 전에 여러 명령을 실행할 수 있습니다.빌드 스크립트에 저장하기 전에 이 작업을 수행하는 것이 좋습니다.
나의 게으른 남자의 해결책은 나의 애플리케이션 코드에서 버전 번호를 업데이트하는 것이었습니다.Root.plist에 기본값(또는 빈 값)을 입력한 다음 시작 코드 어딘가에 입력할 수 있습니다.
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];
업데이트된 버전이 설정 패널에 나타나려면 앱을 한 번 이상 실행해야 합니다.
예를 들어, 앱이 실행된 횟수나 기타 흥미로운 정보의 카운터를 업데이트할 수 있습니다.
@Quinn의 답변에 따라, 여기서 제가 이 작업에 사용하는 전체 프로세스와 작업 코드를 확인합니다.
- 앱에 설정 번들을 추가합니다.이름을 바꾸지 않습니다.
- 설정을 엽니다.텍스트 편집기의 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이 있으면 Settings에서 버전 항목의 인덱스가 됩니다.위의 Root.plist 예제는 인덱스 1에 있습니다.
Ben Clayton의 plist https://stackoverflow.com/a/12842530/338986 를 사용합니다.
더하다Run script
▁snipp 뒤에 스니펫이 .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
약간의 이익이 있습니다.
- 저장소의 작업 복사본에서 파일을 수정하지 않습니다.
- 에 대한 사례 경로가 필요하지 않습니다.
Settings.bundle
$SRCROOT
경로는 다를 수 있습니다.
Xcode 7.3.1에서의 테스트
Xcode 11.4에서는 다음 단계를 사용하여 응용 프로그램의 설정 번들에 응용 프로그램 버전을 표시할 수 있습니다.
트$(MARKETING_VERSION)
그리고.$(CURRENT_PROJECT_VERSION)
if 참: 만$(MARKETING_VERSION)
그리고.$(CURRENT_PROJECT_VERSION)
에 대한 .Bundle version string (short)
그리고.Bundle version
Info.plist의 키를 누르면 다음 단계를 건너뛰고 다음 섹션으로 이동할 수 있습니다.
- Xcode 프로젝트를 엽니다.
- 프로젝트 탐색기()cmd1를 열고 프로젝트를 선택하여 프로젝트 설정을 표시한 다음 앱 대상을 선택합니다.
- 일반 탭을 선택합니다.
- ID 섹션에서 버전 필드 내용을 새 값으로 변경합니다(예:
0.1.0
) 및 빌드 필드 내용을 새 값으로 변경합니다(예:12
) 이 두 가지 변경 사항은 다음과 같습니다.$(MARKETING_VERSION)
그리고.$(CURRENT_PROJECT_VERSION)
변수가 Info.plist 파일에 있습니다.
설정 번들 생성 및 구성
- 프로젝트 탐색기에서 프로젝트를 선택합니다.
- [파일] > [새로 만들기] > [파일...]cmdN을 선택합니다.
- iOS 탭을 선택합니다.
- 리소스 섹션에서 설정 번들을 선택한 다음 다음 만들기를 클릭합니다.
- 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>
실행 스크립트 추가
- 프로젝트 탐색기에서 프로젝트를 선택합니다.
- 앱 대상을 선택합니다.
- 빌드 단계 탭을 선택합니다.
- + > 새 스크립트 실행 단계를 클릭합니다.
- 번들 리소스 복사 섹션 위에 새 단계를 끌어다 놓습니다.이렇게 하면 응용프로그램을 컴파일하기 전에 스크립트가 실행됩니다.
- 새로 추가된 스크립트 실행 단계를 열고 다음 스크립트를 추가합니다.
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
앱 실행
- 장치 또는 시뮬레이터에서 제품()cmdR을 실행합니다.
- 장치 또는 시뮬레이터에서 앱이 실행되면 설정 앱을 열고 타사 앱 목록에서 앱을 선택합니다.앱의 버전은 아래와 같이 표시되어야 합니다.
원천
다음은 설정 번들 버전 번호를 자동으로 업데이트하는 데 사용하는 스크립트입니다.
#! /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)
여기 설정에 있는 루트.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로 업데이트한 다음 프로젝트를 빌드/아카이브하면 Settings 번들에 2.0.11로 표시됩니다.설정 번들 루트.plist를 열면 빌드 프로세스가 끝날 때까지 버전 번호가 업데이트되지 않음을 알 수 있습니다.프로젝트를 다시 빌드하여 설정 번들을 올바르게 업데이트하거나 스크립트를 빌드 전 단계에 추가할 수 있습니다.
- XCode에서 프로젝트 대상에 대한 구성표 편집
- BUILD 구성표에서 노출 화살표를 클릭합니다.
- 그런 다음 "사전 조치" 항목을 클릭합니다.
- 더하기 기호를 클릭하고 "새 스크립트 실행 작업"을 선택합니다.
- 셸 값을 /bin/sh로 설정
- 프로젝트 대상에 "빌드 설정 제공 위치"를 설정
텍스트 영역에 스크립트를 추가합니다.다음 대본이 저에게 효과가 있었습니다.프로젝트 설정과 일치하도록 경로를 수정해야 할 수도 있습니다.
versionString=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJ"ECT_DIR}/${INFOPLIST_FILE})"
/usr/libexec/PlistBuddy "$SRCROOT/설정.bundle/Root.plist" -c "기본 설정 지정자 설정: 0:기본값 $versionString"
이렇게 하면 빌드/아카이브 프로세스 중에 설정 번들이 패키징되기 전에 스크립트가 올바르게 실행됩니다.설정 번들 Root.plist를 열고 프로젝트를 빌드/아카이브하면 빌드 프로세스 시작 시 버전 번호가 업데이트되고 설정 번들에 올바른 버전이 표시됩니다.
pList compiler (http://sourceforge.net/projects/plistcompiler) 오픈소스 프로젝트를 사용하여 원하는 것을 할 수 있었습니다.
이 컴파일러를 사용하면 다음 형식을 사용하여 속성 파일을 .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 ] } ] } }
사용자 지정 실행 스크립트 빌드 단계에서 brad-larson이 설명한 대로 .h 파일에 대한 저장소 수정 버전을 추출했습니다.
plc 파일에는 #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifdef, #endif, xcode 환경 변수와 같은 전처리기 지시어가 포함될 수 있습니다.그래서 다음 지침을 추가하여 변수 kRevisionNumber를 참조할 수 있었습니다.
#include "Revision.h"
또한 프로젝트가 빌드될 때마다 plcompiler를 실행하기 위해 xcode 대상에 사용자 지정 스크립트 빌드 단계를 추가했습니다.
/usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
그리고 그게 끝이었어요!
@Ben Clayton 답변과 @Luis Ascorbe 및 @Vahid Amiri의 의견을 바탕으로 한 제 작업 예:
참고: 이 방법은 설정을 수정합니다.저장소의 작업 복사본에 있는 bundle/Root.plist 파일
프로젝트 루트에 설정 번들을 추가합니다.이름 변경 안 함
설정을 엽니다.소스 코드로 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>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>
프로젝트(대상) 구성표의 빌드, 사전 작업 섹션에 다음 스크립트 추가
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"
현재 구성표 작성 및 실행
위의 답변이 저에게 맞지 않아 사용자 지정 스크립트를 만들었습니다.
그러면 Root.plist의 항목이 동적으로 업데이트됩니다.
아래의 실행 스크립트를 사용합니다.xcode 10.3에서 확실히 검증될 것입니다.
"var buildVersion"은 제목으로 표시할 버전입니다.
그리고 설정의 제목에 대한 식별자 이름은 아래의 "var version"입니다.Root.plist 번들
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>
제가 이 답변(이 게시물을 기준으로)에서 설명한 것과 유사한 방법을 사용하여 이 작업을 수행할 수 있다고 생각합니다.
먼저 VersionValue의 이름을 ${VERS}로 변경하여 Xcode 내의 변수로 만들 수 있습니다.IONVALUE}. 이름이 versionvalue인 파일을 생성합니다.xccconfig를 사용하여 프로젝트에 추가합니다.응용 프로그램 대상으로 이동하고 해당 대상의 빌드 설정으로 이동합니다.VERSIONVALUE를 사용자 정의 빌드 설정으로 추가해야 한다고 생각합니다.해당 창의 오른쪽 아래에서 기준 값을 "버전 값"으로 변경합니다.
마지막으로 대상으로 이동하여 스크립트 실행 빌드 단계를 만듭니다.스크립트 실행 단계를 검사하고 스크립트 텍스트 필드 내의 스크립트에 붙여넣습니다.예를 들어 현재 하위 버전 빌드로 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
이렇게 하면 프로젝트 내에서 이러한 값이 변경될 때 변수를 대체할 수 있습니다.
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"
이것이 저에게 가장 쉬운 해결책이었습니다.
번들 리소스 복사 단계 전에 새 스크립트 빌드 단계 추가
셸:/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)
언급URL : https://stackoverflow.com/questions/877128/how-can-i-display-the-application-version-revision-in-my-applications-settings
'programing' 카테고리의 다른 글
Nodejs 이벤트 루프 (0) | 2023.08.23 |
---|---|
책임감 있는 MySQL 설치 플레이북 (0) | 2023.08.23 |
drop_certificates가 판다에서 작동하지 않습니까? (0) | 2023.08.18 |
Yarn의 로컬 경로로 패키지를 설치하는 방법은 무엇입니까?패키지를 찾을 수 없습니다. (0) | 2023.08.18 |
스위프트를 사용하여 iOS 10에서 전화를 거는 방법은 무엇입니까? (0) | 2023.08.18 |