Xcode14からBitcodeオプションは非推奨になった

[Xcode14のリリースノート](https://developer.apple.com/documentation/xcode-release-notes/xcode-14-release-notes)にあるとおり（下記）、Bitcodeは非推奨となりました。Xcodeプロジェクトの`ENABLE_BITCODE`パラメータのデフォルト値も`YES`から`NO`に変更されています。

> - Starting with Xcode 14, bitcode is no longer required for watchOS and tvOS applications, and the App Store no longer accepts bitcode submissions from Xcode 14.
> - Xcode no longer builds bitcode by default and generates a warning message if a project explicitly enables bitcode: “Building with bitcode is deprecated. Please update your project and/or target settings to disable bitcode.” The capability to build with bitcode will be removed in a future Xcode release. IPAs that contain bitcode will have the bitcode stripped before being submitted to the App Store. Debug symbols for past bitcode submissions remain available for download. (86118779)

以下、機械翻訳。

> - Xcode 14以降、watchOSおよびtvOSアプリケーションではビットコードは不要になり、App StoreはXcode 14からのビットコードの送信を受け付けなくなりました。
> - Xcodeはデフォルトでビットコードをビルドしなくなり、プロジェクトがビットコードを明示的に有効にした場合、警告メッセージを生成します:「ビットコードを使用したビルドは非推奨です。プロジェクトおよび/またはターゲット設定を更新して、ビットコードを無効にしてください。ビットコードでビルドする機能は、将来のXcodeリリースで削除されます。ビットコードを含むIPAは、App Storeに提出される前にビットコードが削除されます。過去のビットコード提出のデバッグシンボルは引き続きダウンロードできます。(86118779)

### Bitcodeとは？

Bitcodeは対象となるアーキテクチャの機械語にコンパイルされる前の中間コード（LLVM IR）です。Bitcodeを有効にすると、アプリのアーカイブ時にこの中間コードも生成されるようになります。これをApp Store Connectに提出することで、私たちがアプリの新しいバージョンを再提出することなく、App Store Connectにてアプリの **バイナリを再最適化** してくれるようになります。Xcode7の時に組み込まれ、デフォルトでオンになっていました。

(参考) [What is app thinning? (iOS, tvOS, watchOS)](https://help.apple.com/xcode/mac/current/#/devbbdc5ce4f)

### なぜBitcodeは廃止されたのか？

上記にある **「バイナリを再最適化」** とは、新しいアーキテクチャのCPUのための再コンパイルにあたると思います。AppleはiPhoneなどのデバイスのCPUを32bitから64bitに変更したり、MacのCPUをIntelからApple Silliconに変更したりしてきました。

このようなCPUアーキテクチャの過渡期において、古いCPU向けのアプリが新しいCPUでも利用できることが重要ですが、iPhoneなどのモバイルデバイスが32bitから64bitに移行するにあたり、Bitcodeがその役割を果たしてきたことになります。

今回、Appleがサポートするデバイスのうち、最後の32bitデバイスであるApple Watch Series 3がサポート対象外となりました。これは64bitへの移行が完了したことを意味し、Bitcodeが役目を終えたということでしょう。

(参考) [stack overflow / Xcode 14 deprecates bitcode - but why?](https://stackoverflow.com/questions/72543728/xcode-14-deprecates-bitcode-but-why)

なお、2021年からMacにおいてもCPUがIntel製のものからApple Siliconへの移行が進んでいます。Intel向けにビルドされたアプリは [Rosseta 2](https://developer.apple.com/documentation/apple-silicon/about-the-rosetta-translation-environment) という技術により、Apple Silicon搭載のMacでも動作するようになっていますね。RossetaはBitcodeのように再コンパイルするのではなく、Intel製バイナリの実行時にApple Sillicon向けに翻訳しながら実行するJust-In-Time(JIT)コンパイル方式をとっています。

(参考) [Appleシリコン搭載MacのRosetta 2](https://support.apple.com/ja-jp/guide/security/secebb113be1/web)

### Xcode14+FastlaneでAppStore用ビルドでエラーになった

Xcode 14にアップデートしたことで、FastlaneによるApp Store用ビルドで次のエラーが発生するようになりました。

```
exportOptionsPlist error for key "uploadBitcode": cannot upload bitcode because bitcode is imbalanced
```

原因は、FastlaneのGymのオプションに`include_bitcode: true`を指定していたためです。これを`false`に変更することでビルドは成功するようになりました。

### App Store Connect上でdSYMファイルが生成されなくなった

Bitcodeを含まないということは、App Store Connect側での最適化が行われなくなるということを意味すると思います。となると、App Store Connect側でのdSYMファイルの生成も行われなくなるのでは？と思い、確認したところ生成されなくなっていました。

![Bitcodeオフ時のメタデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16508/7722798e-f7ee-7f24-d80c-4573174f273a.png)

そのため、App Store Connectへの提出後に、dSYMファイルの生成を待ってダウンロードし、Crashlyticsにアップロードするという手間も不要になったのかなと思います。