PC パソコン

Xcode「CFBundleVersion」エラーの原因と解決方法

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を一致させることが重要です。

  1. CFBundleVersionとは
  2. CFBundleVersionとCFBundleShortVersionStringの違い
  3. 代表的な発生状況
  4. 主な原因
    1. 1. Build番号が空になっている
    2. 2. CURRENT_PROJECT_VERSIONが空
    3. 3. CFBundleVersionへ文字列を入れている
    4. 4. Spaceが含まれている
    5. 5. Info.plistとBuild Settingsが一致していない
    6. 6. 自動生成Info.plistを使用している
    7. 7. DebugとReleaseの値が違う
    8. 8. .xcconfigで上書きしている
    9. 9. User-defined SettingからBuild番号を設定している
    10. 10. CI環境でBuild番号が設定されていない
    11. 11. ScriptのIncrement処理が失敗している
    12. 12. agvtool設定が不完全
    13. 13. ExtensionのBuild番号が不一致
    14. 14. 複数Targetで異なるBuild番号を使用している
    15. 15. App Store Connectで同じBuild番号を再利用している
  5. まず確認すること
    1. 1. XcodeのBuild欄を見る
    2. 2. Build Settingsを確認する
    3. 3. Generate Info.plist Fileを確認する
  6. 解決方法1:Build番号を設定する
  7. 解決方法2:CURRENT_PROJECT_VERSIONを設定する
  8. 解決方法3:Info.plistのCFBundleVersionを確認する
  9. 解決方法4:Build番号を数値形式にする
  10. 解決方法5:VersionとBuildを分ける
  11. 解決方法6:GENERATE_INFOPLIST_FILEがYESならBuild Settingsを修正する
  12. 解決方法7:DebugとReleaseの両方を修正する
  13. 解決方法8:Archive Configurationを確認する
  14. 解決方法9:.xcconfigの値を修正する
  15. 解決方法10:実際に解決されたBuild Settingを見る
  16. 解決方法11:Releaseの値をCommand Lineで確認する
  17. 解決方法12:Processed Info.plistを確認する
  18. 解決方法13:defaultsではなくplutilを利用する
  19. 解決方法14:Build番号をIncrementする
  20. 解決方法15:agvtoolでBuild番号を更新する
  21. 解決方法16:CIのBuild番号を確認する
  22. 解決方法17:Environment Variableが空ならBuildを失敗させる
  23. 解決方法18:App TargetとExtension Targetを確認する
  24. 解決方法19:Extension側もBuild番号を更新する
  25. 解決方法20:共通.xcconfigでBuild番号を管理する
  26. 解決方法21:ScriptでInfo.plistを直接書き換えすぎない
  27. 解決方法22:Info.plistにVariableを使う
  28. 解決方法23:ProjectとTargetのどちらが値を上書きしているか確認する
  29. 解決方法24:User-defined Settingの名前を確認する
  30. 解決方法25:Build Logを確認する
  31. App Store ConnectへUploadするときの注意
  32. CFBundleVersionを毎回増やすべきか
  33. Versionを変えずBuildだけ増やしてよいか
  34. Buildだけ変えたのに反映されない場合
  35. Archive内のBuild番号を確認する
  36. Info.plistにCFBundleVersionが見当たらない場合
  37. CFBundleVersionが正しいのにErrorになる場合
  38. Clean Build Folderで直るか
  39. DerivedData削除は必要か
  40. やってはいけない対処
  41. 最短で確認するチェックリスト
  42. まとめ

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側の設定を放置しないようにしてください。

最短で確認するチェックリスト

  1. TargetのGeneral → Identity → Buildを確認する
  2. CURRENT_PROJECT_VERSIONを確認する
  3. GENERATE_INFOPLIST_FILEがYESかNOか確認する
  4. 実Info.plist方式ならCFBundleVersionを確認する
  5. Build番号へ文字やSpaceが入っていないか確認する
  6. DebugとReleaseの値を確認する
  7. Archive Configurationを確認する
  8. .xcconfigを確認する
  9. User-defined Settingを確認する
  10. CIのBuild番号Variableを確認する
  11. App ExtensionのBuild番号を確認する
  12. 複数Targetの設定を確認する
  13. xcodebuild -showBuildSettingsで実値を確認する
  14. Processed Info.plistのCFBundleVersionを確認する
  15. 再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番号を確認し、その値を正しく設定することが本質的な解決方法です。