こんにちは、亀山です。
fastlane の build_app
(gym) でアーカイブに成功するが、error: exportArchive: Provisioning profile "XXX" doesn't include signing certificate "Apple Distribution: Company Name (XXXXXXXXXX)".
のエラーが出る問題がありました。
build_app
の引数の export_options
に signingCertificate
を明示的に指定することで解決したので、その方法を説明します。
調査
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 すると中身の情報を見ることができます。
ログに 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 を使うとよいようです。