📦

Fastlaneでxcconfigを使ってプロビジョニングプロファイルを切り替えた時に起きた問題と解決策

2023/05/13に公開

起きた問題

iOSのアプリをアーカイブする際、FastlaneのGymを使っているのですが、ビルドするアプリの種類に応じたBundle IDやプロビジョニングプロファイルの切り替えはFastlaneのActionで切り替えていました。これを普通にxcconfigに設定値を書き、xcconfigの切り替えだけでできるようにしようとしたらビルドエラーでハマりました。

切り替えたいxcconfigのそれぞれにこういった指定をしようとしたのですが、

DEVELOPMENT_TEAM = ***
CODE_SIGN_IDENTITY = ***
PROVISIONING_PROFILE_SPECIFIER = ***

このxcconfigをFastfileでgymを呼び出す際に xcconfig: "[xcconfigのパス]", のように引数で渡すと、fastlaneの実行時に次のようなエラーになりました:

error: [パッケージ_ターゲット] has conflicting provisioning settings. [パッケージ_ターゲット] is automatically signed, but provisioning profile [プロビジョニングプロファイル名] has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the Signing & Capabilities editor. (in target '[パッケージ_ターゲット]' from project '[パッケージ]')

原因

調べてみるとこちらのフォーラムで同様の問題が報告されていて、xcodebuildにPROVISIONING_PROFILE_SPECIFIER等の値を渡すと、ビルドしたいアプリのターゲットだけでなく利用パッケージのターゲットにもそれが適用される(おそらくXcode 14からの)仕様により上の問題が起きるようでした。

https://forums.swift.org/t/xcode-14-beta-code-signing-issues-when-spm-targets-include-resources/59685

(今回自分がやった)解決策

上のフォーラムにも近い解決策が出てくるのですが、要は PROVISIONING_PROFILE_SPECIFIER が渡らないようにすればいいので、xcconfig内では [プレフィクス]_PROVISIONING_PROFILE_SPECIFIERのように何らかのプレフィクスをつけて定義しておいて、Xcodeのビルド設定の方で Provisioning Profile のところに $([プレフィクス]_PROVISIONING_PROFILE_SPECIFIER) を設定することで対象のターゲットだけにxcconfigの値が適用されるようにしました。

DEVELOPMENT_TEAMCODE_SIGN_IDENTITYについても同様のことをしました。

※ もしかするともっといい解決策があるかもしれないし、そもそも自分が何か根本的に勘違いをしている説もあるので間違っていたら教えてください。

ハマった理由

これだけ書くとすごく単純なのですが、同様のエラーメッセージが出るケースはもちろんこれ以外にも色々あって、かつビルドの仕方やパッケージマネージャも色々あるので色んな投稿を見て試しにやっていたら時間がかかりました。人によってFastlaneを使っていたりxcodebuild直だったり、Bitriseで起きるとか、xcconfigを使っていたりいなかったり、SPMかCocoaPodsだったり、そもそもGymやxcodebuildの設定や引数のパターンが多すぎたりで無駄に色んな組み合わせを試してしまいました。

ちなみにこれでほぼxcconfigの切り替えだけで設定の違うアプリをアーカイブできるようになったのですが、Gymに渡すオプションで export_options.provisioningProfiles は多分ビルドの設定とは別だからか?なくせまんでした。たぶんexport、つまりアーカイブ用の設定だからだろうと思ってますけどその認識であってます…?

Discussion