지금까지의 길
내 유스 케이스는 다음과 같습니다.
- 버전을 동기화하고 여러 대상에서 번호를 작성하고 있습니다.
- 버전을 동기화하고 대상의 버전과 빌드 번호를
Settigns.bundle
- CI 서버에서 빌드 번호를 읽고 수정하고 있습니다.
이전에는 대상 빌드 스크립트로 포인트 1과 2를 실행하고 CI 자체에서 사용자 정의 스크립트로 포인트 3을 실행했습니다.
Xcode 빌드 설정 내에 버전 및 빌드를 저장하는 새로운 방법은 더 이상 값을 효과적으로 수정할 수 없기 때문에 스크립트에 문제를 일으켰습니다. 최소한 읽을 수있었습니다.
불행히도 Xcode가 버전 및 빌드 번호를 프로젝트 빌드 설정에 저장하지 못하게하는 합법적 인 방법을 발견 할 수 없었지만 해결 방법을 만들었습니다.
빌드 또는 아카이브가 작성되면에 쓰여진 값 Info.plist
이 사용됩니다. 즉, 빌드 시간 동안 값이 대체되므로 동일한 빌드 시간 동안 값을 수정할 수 없습니다.
또한 xcodeproj
cli를 사용하여 프로젝트를 수정하려고 시도했지만 프로젝트 변경으로 인해 빌드가 중지 되어이 솔루션이 작동하지 않았습니다.
결국, 내가 시도한 많은 다른 접근법 후에 마침내 Xcode의 새로운 행동을 위반하지 않는 타협을 찾았습니다.
짧은 답변:
타겟이 액션을 미리 같이, 스크립트는 상기 각각의 값을 기록하는 실행 CFBundleShortVersionString
및 CFBundleVersion
타겟으로의Info.plist
진리의 근원으로, 나는의 값을 읽기 위해 엑스 코드 빌드 설정을 사용 MARKETING_VERSION
하고 CURRENT_PROJECT_VERSION
원하는 대상의합니다.
이런 방식으로 프로젝트 설정에서 값을 수정하면 (다음 빌드 / 아카이브시) Info.plist
기존 스크립팅 로직이 계속 작동하는 경우이를 허용합니다.
자세한 답변
빌드 조치시 자원을 수정하는 유일한 방법은 pre-action
스크립트를 사용하는 것 입니다. 빌드 스크립트에서 수행하려고하면 변경 사항이 즉시 적용되지 않으며 빌드 / 아카이브 끝에 표시되지 않습니다.
사전 빌드 조치를 추가하려면 구성표 편집으로 이동하십시오.
그런 다음 빌드 및 아카이브 섹션을 펼치십시오. 에서 드롭 다운을 Pre-action
클릭 Provide build and settings from
하고 값을 읽으려는 진리의 대상을 선택하십시오.
다음 스크립트를 추가하십시오.
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
스크립 라인은 다음을 수행합니다.
- 실행하기 위해 동기화 스크립트가있는 디렉토리로 이동하십시오.
- 사전 조치 중에 로그를 쓸 수 있습니다. 그렇지 않으면 기본적으로 모든 출력이 침묵됩니다.
- 제공하여 동기화 스크립트를 실행
MARKETING_VERSION
및CURRENT_PROJECT_VERSION
마지막 단계는 제공된 값 MARKETING_VERSION
과 CURRENT_PROJECT_VERSION
해당 대상 및 원하는 때마다 값을 읽는 고유 한 동기화 스크립트를 작성하는 것입니다.
필자의 경우 스크립트는 다음과 같습니다.
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
공유 Info.plist
및 Settings.bundle
두 앱 대상 사이를 사용 하므로 한 번 업데이트해야합니다.
또한 알림 서비스 확장을 사용합니다.이 서비스 BadgeCounter
는 정확히 동일한 버전이어야하며 포함 된 대상과 빌드해야합니다. 그래서 이것도 업데이트합니다.