[iOS] Xcode 13でApp Store ConnectにバイナリアップロードするとRxSwift 6.2.0でCFBundleVersionのエラー

2022.03.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。きんくまです。

ものすごく限定的かもしれませんが、共有です。

現象

  • Xcode 13.1
  • RxSwift 6.2.0 (Carthageを使用。ただしCarthageではビルドせずに、xcframeworkを直接GitHubのReleaseからダウンロードしている)

App Store Connectにバイナリアップロードすると以下のエラーが出ました。

App Store Connect Operation Error

This bundle Payload/XXX.app/Frameworks/RxCocoa.framework is invalid. 
The Info.plist file is missing the required key: CFBundleVersion. 
Please find more information about CFBundleVersion at 
https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleversion
With error code STATE_ERROR.VALIDATION_ERROR.90056 for id xxxxxxxxx

関連する現象

話は少し脱線しますが、関連する項目なので。
Xcode 13から新しいオプションが追加されてました。

Manage Version and Build Number です。

これは何をするものかというと、自動でバージョン番号とビルド番号を変更してくれるものです。
App Store Connectにアップロードするときは、ビルド番号がかぶらないようにするために、1ずつインクリメントする必要があります。
それを自動でやってくれるようなのですが、もしこのオプションを入れてしまうと、以下のことがおきました。

ライブラリのバージョンとビルド番号が強制的にアプリのバージョンに書き換えられてしまう!

例
アプリ
バージョン: 1.2.3
ビルド番号: 1.2.3

Alamofire
バージョン: 5.4.0
ビルド番号: 1

このオプションを入れると、以下のようになる(えー!?)

アプリ
バージョン: 1.2.3
ビルド番号: 1.2.3

Alamofire
バージョン: 1.2.3
ビルド番号: 1.2.3

というわけで、チェックをはずしています。

原因

たぶんさきほどのバージョン番号管理が厳しくなったことに関連してると思うのですが、App Store Connectではビルド番号を設定していないライブラリを使っている場合、エラー扱いで通してくれません。
RxSwift 6.2.0はビルド番号が設定されていませんでした。そのためエラーが出ているようです。
最初に書いたのですが、RxSwiftの6.2.0はGitHubのバイナリを落としてきてそのまま使っています。

https://github.com/ReactiveX/RxSwift/releases/tag/6.2.0

ここでこの状態のままストア申請をすすめて、ライブラリ一覧がでてくる画面でチェックするとこのような表示になります。

Version: 1.0

バージョン番号だけが設定されていて、ビルド番号が設定されていません。正常ですと、アプリバージョンの後ろに、ビルド番号がかっこで入ります。

Version: 1.0 (1)

エラー内容はビルド番号がないということなので、自前で設定してあげます。

修正

パス

Carthage/Build/RxSwift.xcframework/ios-arm64_armv7/RxSwift.framework/Info.plist

これをXcodeで開きます。

Bundle version string (short) : 1.0

上記はバージョン番号のみが設定されています。バージョン番号がおかしいのと、ビルド番号が入っていないので、修正します。

Bundle version string (short) : 6.2.0     -> 数値を編集します
Bundle version: 1     -> これは項目自体が存在しないので +ボタンを押して項目を追加して設定します

これでビルド番号が設定できました。
ビルド番号は他のライブラリを見たところ1で設定されているものがほとんどだったのでそうしています。

RxSwiftのその他のライブラリも同様に修正します。

  • RxSwift.xcframework
  • RxRelay.xcframework
  • RxCocoa.xcframework
  • RxCocoaRuntime.xcframework
  • RxBlocking.xcframework

この状態で、再度Archiveします。そして、ライブラリ一覧が出る画面で確認すると

Version: 6.2.0 (1)

上記のように、バージョン番号とビルド番号が正しく設定できました。

これで、ようやくアップロードが正常終了しました。

まとめ

ちなみに、RxSwiftの次のバージョンの6.5.0だとバージョン番号とビルド番号が設定されているようでした。
(ただしRxSwift6.5.0はXcode 13.2.1でビルドすると、iOS 12でアプリが起動時に落ちるXcodeのバグがあるので、使いずらかったです、、。)

ではでは