XcodeでAppをBuild、Archive、App Store ConnectへUploadした際に、CFBundleVersionに関係するErrorやWarningが表示されることがあります。
例えば:
CFBundleVersion is missing
や:
CFBundleVersion must be a period-separated list of at most three non-negative integers
また、App Store ConnectへのUpload時にBuild番号が不正・重複していることを示すMessageが表示されることもあります。
CFBundleVersionはAppのBuildを識別するための値です。Xcodeでは通常「Build」として表示され、Build SettingではCURRENT_PROJECT_VERSIONが対応します。
解決するときは、VersionとBuildを混同せず、現在のTargetがInfo.plistを自動生成しているのか、実際のInfo.plist Fileを使用しているのかを確認したうえで、CFBundleVersionの値とBuild Settingを一致させることが重要です。
- CFBundleVersionとは
- CFBundleVersionとCFBundleShortVersionStringの違い
- 代表的な発生状況
- 主な原因
- 1. Build番号が空になっている
- 2. CURRENT_PROJECT_VERSIONが空
- 3. CFBundleVersionへ文字列を入れている
- 4. Spaceが含まれている
- 5. Info.plistとBuild Settingsが一致していない
- 6. 自動生成Info.plistを使用している
- 7. DebugとReleaseの値が違う
- 8. .xcconfigで上書きしている
- 9. User-defined SettingからBuild番号を設定している
- 10. CI環境でBuild番号が設定されていない
- 11. ScriptのIncrement処理が失敗している
- 12. agvtool設定が不完全
- 13. ExtensionのBuild番号が不一致
- 14. 複数Targetで異なるBuild番号を使用している
- 15. App Store Connectで同じBuild番号を再利用している
- まず確認すること
- 解決方法1:Build番号を設定する
- 解決方法2:CURRENT_PROJECT_VERSIONを設定する
- 解決方法3:Info.plistのCFBundleVersionを確認する
- 解決方法4:Build番号を数値形式にする
- 解決方法5:VersionとBuildを分ける
- 解決方法6:GENERATE_INFOPLIST_FILEがYESならBuild Settingsを修正する
- 解決方法7:DebugとReleaseの両方を修正する
- 解決方法8:Archive Configurationを確認する
- 解決方法9:.xcconfigの値を修正する
- 解決方法10:実際に解決されたBuild Settingを見る
- 解決方法11:Releaseの値をCommand Lineで確認する
- 解決方法12:Processed Info.plistを確認する
- 解決方法13:defaultsではなくplutilを利用する
- 解決方法14:Build番号をIncrementする
- 解決方法15:agvtoolでBuild番号を更新する
- 解決方法16:CIのBuild番号を確認する
- 解決方法17:Environment Variableが空ならBuildを失敗させる
- 解決方法18:App TargetとExtension Targetを確認する
- 解決方法19:Extension側もBuild番号を更新する
- 解決方法20:共通.xcconfigでBuild番号を管理する
- 解決方法21:ScriptでInfo.plistを直接書き換えすぎない
- 解決方法22:Info.plistにVariableを使う
- 解決方法23:ProjectとTargetのどちらが値を上書きしているか確認する
- 解決方法24:User-defined Settingの名前を確認する
- 解決方法25:Build Logを確認する
- App Store ConnectへUploadするときの注意
- CFBundleVersionを毎回増やすべきか
- Versionを変えずBuildだけ増やしてよいか
- Buildだけ変えたのに反映されない場合
- Archive内のBuild番号を確認する
- Info.plistにCFBundleVersionが見当たらない場合
- CFBundleVersionが正しいのにErrorになる場合
- Clean Build Folderで直るか
- DerivedData削除は必要か
- やってはいけない対処
- 最短で確認するチェックリスト
- まとめ
CFBundleVersionとは
CFBundleVersionはBundleのBuildを識別するために使用される値です。
XcodeのTarget設定では通常:
Build
として表示されます。
Build Settingsでは:
CURRENT_PROJECT_VERSION
が対応します。
例えば:
Version: 1.2.0 Build: 35
なら、一般的には:
CFBundleShortVersionString = 1.2.0 CFBundleVersion = 35
となります。
ポイント:CFBundleVersionはBuild番号、CFBundleShortVersionStringはユーザーに表示するVersion番号です。似ていますが役割が異なります。
CFBundleVersionとCFBundleShortVersionStringの違い
混同しやすいので、まず整理します。
CFBundleVersion:Buildを識別する値CFBundleShortVersionString:ユーザー向けVersion
例えば:
Version 2.1.0 Build 147
なら:
CFBundleShortVersionString = 2.1.0 CFBundleVersion = 147
という関係になります。
代表的な発生状況
- Build番号が空欄になっている
- CFBundleVersion Keyが存在しない
- Build番号へ不正な文字を入力している
- Build番号へSpaceや記号を入れている
- Info.plistとBuild Settingsの値が食い違っている
- GENERATE_INFOPLIST_FILEを使用しているのにInfo.plistだけ編集している
- DebugとReleaseでBuild番号が違う
- Archiveだけ古いBuild番号を使用している
- .xcconfigがCURRENT_PROJECT_VERSIONを上書きしている
- 複数TargetのBuild番号が一致していない
- ExtensionのCFBundleVersionが不整合になっている
- CIでBuild番号の自動更新に失敗している
- Scriptから空文字列が設定されている
- App Store Connectへ以前使用したBuild番号を再Uploadしている
主な原因
1. Build番号が空になっている
Xcodeの:
Target → General → Identity → Build
が空欄の場合、CFBundleVersionを適切に生成できない構成があります。
2. CURRENT_PROJECT_VERSIONが空
Build Settingsで:
CURRENT_PROJECT_VERSION
が空になっていないか確認します。
3. CFBundleVersionへ文字列を入れている
例えば:
build35
や:
release-35
のような値は避けます。
Build番号として数値形式を使用してください。
4. Spaceが含まれている
例えば:
35 beta
のような値はBuild番号として適切ではありません。
5. Info.plistとBuild Settingsが一致していない
実Info.plistに:
<key>CFBundleVersion</key> <string>20</string>
と書いていても、Build Settingから別の値へ置き換えられている場合があります。
6. 自動生成Info.plistを使用している
現在のXcodeでは:
GENERATE_INFOPLIST_FILE = YES
の場合、Info.plistをBuild時に生成できます。
この構成では、Build番号は:
CURRENT_PROJECT_VERSION
から生成されるCFBundleVersionへ反映されます。
そのため、Project Navigator上のInfo.plistだけを編集しても期待どおり変わらない場合があります。
7. DebugとReleaseの値が違う
Debug:
CURRENT_PROJECT_VERSION = 35
Release:
CURRENT_PROJECT_VERSION =
のような状態なら、通常Buildは成功してArchiveだけ失敗する可能性があります。
8. .xcconfigで上書きしている
例えば:
CURRENT_PROJECT_VERSION = 20
という設定が.xcconfigに残っていると、Xcode UIで変更したつもりでも別値が使用される場合があります。
9. User-defined SettingからBuild番号を設定している
CURRENT_PROJECT_VERSION = $(BUILD_NUMBER)
としている場合、BUILD_NUMBERが未定義だと空値になる可能性があります。
10. CI環境でBuild番号が設定されていない
GitHub Actions、Xcode Cloud、JenkinsなどでEnvironment VariableからBuild番号を設定している場合、Variableの取得失敗が原因になることがあります。
11. ScriptのIncrement処理が失敗している
Build前にBuild番号を自動更新しているProjectでは、Script Errorによって古い値や空値が残る場合があります。
12. agvtool設定が不完全
Apple Generic Versioningを利用するProjectでは、Versioning SystemとCURRENT_PROJECT_VERSIONの設定が必要です。
13. ExtensionのBuild番号が不一致
WidgetやNotification Service Extensionなどを含むAppでは、Extension側のBundle Versionも確認してください。
14. 複数Targetで異なるBuild番号を使用している
App TargetとExtension Targetの設定を別々に管理している場合、片方だけ更新し忘れることがあります。
15. App Store Connectで同じBuild番号を再利用している
すでにUpload済みのVersion・Buildの組み合わせを再Uploadすると、Upload時に拒否される場合があります。
まず確認すること
1. XcodeのBuild欄を見る
次を開きます。
Target → General → Identity
ここで:
Version Build
を確認します。
例えば:
Version = 1.0 Build = 35
のように設定します。
2. Build Settingsを確認する
検索欄へ:
Current Project Version
と入力します。
Build Setting名は:
CURRENT_PROJECT_VERSION
です。
3. Generate Info.plist Fileを確認する
GENERATE_INFOPLIST_FILE
がYESかNOか確認します。
重要:自動生成方式なら、CFBundleVersionを直接Info.plistだけで管理するのではなく、CURRENT_PROJECT_VERSIONを確認することが重要です。
解決方法1:Build番号を設定する
Xcodeで:
Target → General → Identity → Build
へ:
1
や:
35
などのBuild番号を設定します。
解決方法2:CURRENT_PROJECT_VERSIONを設定する
Build Settingsで:
CURRENT_PROJECT_VERSION = 35
のように設定します。
解決方法3:Info.plistのCFBundleVersionを確認する
実Info.plistを使用している場合:
<key>CFBundleVersion</key> <string>35</string>
となっているか確認します。
ただし、値にBuild Setting Variableを使用する構成もあります。
<key>CFBundleVersion</key> <string>$(CURRENT_PROJECT_VERSION)</string>
この場合はCURRENT_PROJECT_VERSION側を修正します。
解決方法4:Build番号を数値形式にする
問題:
Build = beta-35
修正:
Build = 35
Build Channelなどの情報は別の設定やMetadataで管理してください。
解決方法5:VersionとBuildを分ける
例えば:
Version = 2.3.0 Build = 147
のようにします。
Buildへ:
2.3.0 release
のようなVersion名や文字列を混在させない方が管理しやすくなります。
解決方法6:GENERATE_INFOPLIST_FILEがYESならBuild Settingsを修正する
自動生成構成なら:
GENERATE_INFOPLIST_FILE = YES CURRENT_PROJECT_VERSION = 35
を確認します。
Xcodeが生成するInfo.plistへCFBundleVersionが反映されます。
解決方法7:DebugとReleaseの両方を修正する
Build SettingsをLevels表示にして、Debug・Releaseの値を確認します。
例えば:
Debug = 35 Release = 35
のように、意図する値がすべてのConfigurationへ設定されているか確認します。
解決方法8:Archive Configurationを確認する
次を開きます。
Product → Scheme → Edit Scheme → Archive
どのConfigurationを使用しているか確認し、そのConfigurationのCURRENT_PROJECT_VERSIONを調べます。
解決方法9:.xcconfigの値を修正する
例えば:
CURRENT_PROJECT_VERSION = 35
とします。
Project内を検索するなら:
grep -R "CURRENT_PROJECT_VERSION" .
が利用できます。
解決方法10:実際に解決されたBuild Settingを見る
Terminalで:
xcodebuild -showBuildSettings | grep CURRENT_PROJECT_VERSION
を実行します。
Schemeを指定するなら:
xcodebuild \ -project MyApp.xcodeproj \ -scheme MyApp \ -showBuildSettings | grep CURRENT_PROJECT_VERSION
解決方法11:Releaseの値をCommand Lineで確認する
xcodebuild \ -project MyApp.xcodeproj \ -scheme MyApp \ -configuration Release \ -showBuildSettings | grep CURRENT_PROJECT_VERSION
Archiveだけ失敗する場合の切り分けに有効です。
解決方法12:Processed Info.plistを確認する
ArchiveやBuild後に、最終的なApp Bundleへ入ったInfo.plistを確認できます。
例えば:
plutil -p /path/to/MyApp.app/Info.plist
CFBundleVersionだけ確認するなら:
plutil -p /path/to/MyApp.app/Info.plist | grep CFBundleVersion
Project上の設定ではなく、最終成果物に入った値を確認できます。
解決方法13:defaultsではなくplutilを利用する
plist内容の確認には:
plutil -p Info.plist
を使用するとKeyとValueを確認しやすくなります。
解決方法14:Build番号をIncrementする
App Store Connectへすでに同じBuildをUploadしている場合は、例えば:
35 → 36
のようにBuild番号を更新します。
Versionを変更せずにBuildだけ増やすことも一般的です。
解決方法15:agvtoolでBuild番号を更新する
Apple Generic Versioningを利用しているProjectでは、設定後に:
xcrun agvtool new-version -all 36
のようにBuild番号を更新できます。
現在値を確認する例:
xcrun agvtool what-version
注意:agvtoolを利用する場合はProjectのVersioning Systemなどの設定が必要です。単純なProjectではXcodeのBuild欄を直接変更する方が分かりやすい場合があります。
解決方法16:CIのBuild番号を確認する
例えば:
CURRENT_PROJECT_VERSION = $(CI_BUILD_NUMBER)
としている場合、CI_BUILD_NUMBERが設定されているか確認します。
Shell Scriptでは:
echo "$CI_BUILD_NUMBER"
で確認できます。
解決方法17:Environment Variableが空ならBuildを失敗させる
自動化環境では、空のBuild番号をそのまま使用するより、Scriptで検証する方が安全です。
if [ -z "$CI_BUILD_NUMBER" ]; then echo "CI_BUILD_NUMBER is empty" exit 1 fi
解決方法18:App TargetとExtension Targetを確認する
例えば:
MyApp MyWidget NotificationService
など複数Targetがある場合、それぞれのBuild Settingsで:
CURRENT_PROJECT_VERSION
を確認します。
解決方法19:Extension側もBuild番号を更新する
Main Appだけ更新し、Extension側に古いBuild番号が残っている場合は、Upload時のValidation Errorにつながることがあります。
複数Targetを同じBuild番号で管理するなら、共通.xcconfigへまとめる方法もあります。
解決方法20:共通.xcconfigでBuild番号を管理する
例えば:
CURRENT_PROJECT_VERSION = 36
を共通Configurationへ置くと、複数Targetの更新漏れを減らせます。
解決方法21:ScriptでInfo.plistを直接書き換えすぎない
Build PhaseでInfo.plistそのものを直接変更すると、Xcodeの生成処理やBuild Settingsと競合することがあります。
Build番号は可能であれば:
CURRENT_PROJECT_VERSION
を中心に管理すると構成が分かりやすくなります。
解決方法22:Info.plistにVariableを使う
実Info.plist方式なら:
<key>CFBundleVersion</key> <string>$(CURRENT_PROJECT_VERSION)</string>
とし、Build Settingを唯一の管理場所にする方法があります。
解決方法23:ProjectとTargetのどちらが値を上書きしているか確認する
Build Settingsを:
Levels
表示にすると:
- Default
- Project
- Target
- .xcconfig
など、どこから値が来ているか切り分けやすくなります。
解決方法24:User-defined Settingの名前を確認する
例えば:
BUILD_NUMBER
と:
BUILD_NUM
を取り違えているだけでも、展開結果が空になる場合があります。
解決方法25:Build Logを確認する
XcodeのReport Navigatorから失敗したBuildを開き:
ProcessInfoPlistFile
や:
CFBundleVersion
を検索します。
最終的にどのValueが処理されているか確認してください。
App Store ConnectへUploadするときの注意
App Store Connectでは、同じVersion内でも複数のBuildをUploadできます。
例えば:
Version 1.2.0 Build 40
Version 1.2.0
Build 41
Version 1.2.0
Build 42
のようにBuild番号を増やしてUploadしていく運用ができます。
以前使用したBuild番号を再利用せず、新しいBuildでは番号を増やす方が安全です。
CFBundleVersionを毎回増やすべきか
App Store Connectへ新しいBinaryをUploadする場合は、新しいBuildを識別できるBuild番号に更新します。
例えば:
100 101 102 103
のような連番でも管理できます。
Versionを変えずBuildだけ増やしてよいか
はい。開発中の同一VersionについてBuildだけを更新する運用は一般的です。
例えば:
Version 2.0.0 Build 1
のBug修正版をUploadするなら:
Version 2.0.0 Build 2
のようにできます。
Buildだけ変えたのに反映されない場合
次を確認してください。
- 編集したTargetが正しいか
- Archive Configurationが正しいか
- CURRENT_PROJECT_VERSIONが上書きされていないか
- .xcconfigが古い値を設定していないか
- Extensionが別値になっていないか
- Archiveし直したか
- 古いArchiveをUploadしていないか
Archive内のBuild番号を確認する
Archiveから.appを確認できる場合、Info.plistへ:
plutil -p MyApp.app/Info.plist | grep CFBundleVersion
を実行すると、Upload対象に実際に入っているBuild番号を確認できます。
Info.plistにCFBundleVersionが見当たらない場合
GENERATE_INFOPLIST_FILEを使用しているProjectでは、Source側に従来のInfo.plistが存在しないことがあります。
その場合は:
Target → General → Identity → Build
または:
Build Settings → Current Project Version
を確認してください。
注意:Info.plist FileがProject Navigatorにないからといって、CFBundleVersion自体が存在しないとは限りません。Build時に生成されている場合があります。
CFBundleVersionが正しいのにErrorになる場合
次も確認してください。
- Release Configurationの値
- App Extensionの値
- .xcconfig
- User-defined Build Setting
- CI Environment Variable
- Processed Info.plist
- UploadしているArchiveが最新か
Clean Build Folderで直るか
Build番号の値そのものが不正な場合:
Product → Clean Build Folder
だけでは直りません。
ただしBuild Settingを修正した後に、古いBuild Artifactが疑われる場合は補助的に実行できます。
DerivedData削除は必要か
通常、CFBundleVersion Errorの最初の対処ではありません。
必要に応じて:
rm -rf ~/Library/Developer/Xcode/DerivedData/*
を試せますが、CURRENT_PROJECT_VERSIONが空や不正なままなら解決しません。
注意:まずBuild番号、CURRENT_PROJECT_VERSION、Release Configuration、Extensionの設定を確認してください。
やってはいけない対処
Errorを消すためだけにCFBundleVersionを適当な文字列へ変更するのは避けてください。
例えば:
build-final release test-build
のような値ではなく、Build番号として管理しやすい数値形式を使用します。
また、Main AppだけBuild番号を変更して、Extension側の設定を放置しないようにしてください。
最短で確認するチェックリスト
- TargetのGeneral → Identity → Buildを確認する
- CURRENT_PROJECT_VERSIONを確認する
- GENERATE_INFOPLIST_FILEがYESかNOか確認する
- 実Info.plist方式ならCFBundleVersionを確認する
- Build番号へ文字やSpaceが入っていないか確認する
- DebugとReleaseの値を確認する
- Archive Configurationを確認する
- .xcconfigを確認する
- User-defined Settingを確認する
- CIのBuild番号Variableを確認する
- App ExtensionのBuild番号を確認する
- 複数Targetの設定を確認する
- xcodebuild -showBuildSettingsで実値を確認する
- Processed Info.plistのCFBundleVersionを確認する
- 再UploadならBuild番号を更新する
まとめ
XcodeのCFBundleVersion Errorは、AppのBuild番号に関係する設定が空、不正、重複、またはTarget間で不整合になっている場合に発生します。
CFBundleVersionは主にBuildを識別する値で、Xcodeでは通常「Build」、Build SettingsではCURRENT_PROJECT_VERSIONとして管理されます。
現在のXcodeでInfo.plistを自動生成しているTargetでは、CURRENT_PROJECT_VERSIONが生成されるCFBundleVersionへ反映されるため、Info.plistだけを探して編集する必要がない場合があります。
まずGeneralのBuild欄、CURRENT_PROJECT_VERSION、GENERATE_INFOPLIST_FILEを確認してください。
Archiveだけ失敗する場合はRelease Configuration、CIだけ失敗する場合はEnvironment Variableや.xcconfig、Extensionを含むAppでは各TargetのBuild番号も確認します。
App Store Connectへ新しいBinaryをUploadするときは、新しいBuildを識別できるBuild番号へ更新してください。
Clean Build FolderやDerivedData削除は補助策です。CFBundleVersion Errorでは、実際にArchiveへ入るBuild番号を確認し、その値を正しく設定することが本質的な解決方法です。
