[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"
추가 CFBundleVersion
로 CFBundleShortVersionString
. 다음과 같은 버전을 내 보냅니다.
$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist
대신에 편지를 쓰면
$SRCROOT
몇 가지 이점이 있습니다.
- 저장소의 작업 복사본에서 파일을 수정하지 않습니다.
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
- Xcode 프로젝트를 엽니 다.
- 열기 프로젝트 네비게이터 (cmd1 )를 설정을 표시 할 프로젝트를 선택한 다음 앱 대상을 선택합니다.
- 일반 선택 탭을 하십시오.
- 에서 신원 섹션에서 변경 버전의 새로운 값 (예에 필드 내용을
0.1.0
)하고 변경 빌드 새로운 값 (예에 필드 내용을12
). 이 두 가지 변경 사항은 Info.plist 파일에$(MARKETING_VERSION)
및$(CURRENT_PROJECT_VERSION)
변수를 생성 합니다.
설정 번들 생성 및 구성
- 에서 프로젝트 네비게이터 를 선택합니다.
- 선택 파일 > 새로 만들기 > 파일 … (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장치 또는 시뮬레이터 에서 제품 ( )을 실행합니다 .
- 기기 또는 시뮬레이터에서 앱이 실행되면 설정 앱을 열고 타사 앱 목록에서 앱을 선택합니다. 앱의 버전이 아래와 같이 표시되어야합니다.