Open4

アーカイブビルドとバリデーションのつまづき知見

だじだじ

iOSのプロジェクトをアーカイブしてASCへのアップロードまでしたら色々とつまづいたのでメモ。今まで要件を満たしたプロジェクトに参加するだけだったので、何に気をつけるべきなのかわかってなかった…😇

だじだじ

Command SetOwnerAndGroup failed with a nonzero exit code でアーカイブビルドが失敗する

⌘ + Q でXcodeを完全終了しただけで直った🧐 調べた感じこのエラー文の原因も解決法も複数ありそうなので、あんまり参考にならないかも

だじだじ

Invalid large app icon. ... can’t be transparent or contain an alpha channel. ... でアーカイブの検証に失敗する

エラー文の通り、アプリのアイコン画像にアルファチャンネルの情報が入っていたことが原因。画像にアルファチャンネルを含まない形式のもので差し替えて解決。PNGの画像で引っかかったけど、PNGでもアルファチャンネルの情報がなければ問題なかった

だじだじ

Invalid Bundle. ~.framework' contains disallowed file 'Frameworks'.~ でアーカイブの検証に失敗する

アーカイブ後のアプリの検証で発生。エラー文の通り、フレームワークにフレームワークが含まれていることが原因。動的フレームワークによるマルチモジュール構成を行うときのEmbedの関係が適切でなかった

Xcodeでターゲットに動的フレームワークを依存させる場合に以下のGUIをいじるが、

embedとは埋め込むという意味で、ターゲットの成果物にフレームワークを埋め込むかどうかを選択している。しかし以下のテクニカルノートによると、
https://developer.apple.com/library/archive/technotes/tn2435/_index.html#//apple_ref/doc/uid/DTS40017543-CH1-PROJ_CONFIG-APPS_WITH_DEPENDENCIES_BETWEEN_FRAMEWORKS
iOSアプリにおいては他フレームワークを含むフレームワークはサポートされていないため、 Do Not Embed を選択するのが正解だった。このままでは依存するフレームワークがどこにもいなくなってしまうので、モジュールの情報からビルドはできてもランタイムでクラッシュしてしまう。これを解決するためにアプリ側で Embed してバンドルする必要がある

SwiftPMのマルチモジュール構成なら気にする必要もないのだけど…🥺