fastlane で iOS アプリをビルドする際に signing certificate のエラーが出る問題の対応

こんにちは、亀山です。

fastlane の build_app (gym) でアーカイブに成功するが、error: exportArchive: Provisioning profile "XXX" doesn't include signing certificate "Apple Distribution: Company Name (XXXXXXXXXX)". のエラーが出る問題がありました。

build_app の引数の export_optionssigningCertificate を明示的に指定することで解決したので、その方法を説明します。

調査

fastlane で TestFlight へアップロードするための lane を用意したところ、ビルド時にエラーが出てアップロードができませんでした。 ログを確認すると ** ARCHIVE SUCCEEDED ** と出ており、その後の export の段階で失敗していることが分かりました。

error: exportArchive: Provisioning profile "XXX" doesn't include signing certificate "Apple Distribution: Company Name (XXXXXXXXXX)

Xcode 側では iPhone Distribution: Company Name (XXXXXXXXXX) を指定していますが、なぜか fastlane ではその指定が無視され Apple Distribution が利用されています。

利用している Provisioning profile には Apple Distribution ではなく iOS Distribution が入っていました。 ちなみに ~/Library/MobileDevice/Provisioning Profiles にある .movileprovision を Space キーなどで Quick Look すると中身の情報を見ることができます。

f:id:ryoheyc:20220323170901p:plain

ログに export を行っている xcbuild のコマンドが出力されているので、このコマンドを調べました。

/usr/bin/xcrun /path/to/AppProject/vendor/bundle/ruby/2.6.0/gems/fastlane-2.198.1/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh -exportArchive -exportOptionsPlist '/var/folders/3y/v4gw12vn3dlbxtw4bcm2xd5h0000gn/T/gym_config20220318-82449-1kqppz2.plist' -archivePath /Users/ryohey/Library/Developer/Xcode/Archives/2022-03-18/AppName\ 2022-03-18\ 13.19.55.xcarchive -exportPath '/var/folders/3y/v4gw12vn3dlbxtw4bcm2xd5h0000gn/T/gym_output20220318-82449-hvvu32' -allowProvisioningUpdates PROVISIONING_PROFILE_SPECIFIER='XXX'

そこで exportOptionsPlist に渡されている plist を見てみると、signingCertificate が指定されていませんでした。この plist は gym が生成しているものです。 plist を手動で書き換えて signingCertificate を追加すると export が成功するようになりました。

Gymfile

生成される plist に signingCertificate が指定されるように、Gymfile や build_app (gym) の引数を修正します。

workspace("AppName.xcworkspace")
scheme("AppName")

output_directory("./build")

export_options({
  method: "app-store",
  provisioningProfiles: {
    "com.company.AppName" => "XXX"
  },
  signingCertificate: "iPhone Distribution: Company Name (XXXXXXXXXX)"
})

export_team_id("XXXXXXXXXX")

補足

export_options に codesigning_identity を指定しても変わりませんでした。signingCertificate を使うとよいようです。