codemagicのiOSビルドで Did not find matching provisioning profiles for code signing!
事象
Flutter向けのCI/CDサービスの Codemagic を使っていて、 ios/Runner.xcodeproj/project.pbxproj
を PRODUCT_BUNDLE_IDENTIFIER
を jp.co.takeyuweb.app.${DEFINE_BUILD_ENV}
のように変数を埋め込む形にしたところ、
== Building for iOS == > xcode-project use-profiles Configure code signing settings Searching for files matching /Users/builder/Library/MobileDevice/Provisioning Profiles/*.mobileprovision List available code signing certificates in keychain /private/var/folders/pj/2d8_b7sn6f37c48z4jj09xk80000gn/T/build_k021qytp.keychain Searching for files matching /Users/builder/clone/**/*.xcodeproj Completed configuring code signing settings Did not find matching provisioning profiles for code signing! Generated options for exporting IPA - Method: ad-hoc - Provisioning Profiles: [] - Signing Certificate: - Signing Style: manual - Team Id: Saved export options to /Users/builder/export_options.plist
のようなエラーが出て正しくプロビジョニングプロファイルを選択できなくなりました。
原因
どうも
Searching for files matching /Users/builder/clone/*/.xcodeproj
でわかるとおり、 *.xcodeproj
以下のファイルに PRODUCT_BUNDLE_IDENTIFIER
が設定されていればそれを優先して使用するようになっていて、ここに jp.co.takeyuweb.app.${DEFINE_BUILD_ENV}
のような Bundle Identifier そのものでない文字列を設定していると、うまく扱えず死んでしまいます。
なお、 PRODUCT_BUNDLE_IDENTIFIER
の設定がない場合 Info.plist
を設定していれば問題は発生しません。
対策
次の2つが有効でした。
- PRODUCT_BUNDLE_IDENTIFIER を書き換える
- PRODUCT_BUNDLE_IDENTIFIER を削除して
Info.plist
のCFBundleIdentifier
に設定する
A. xcodeproj を書き換えてやる
まず、 Pre-build script
で ios/Runner.xcodeproj/project.pbxproj
を書き換えて期待する Bundle Identifier にしてしまう方法です。
#!/bin/bash # codemagic ビルド時に bundle identifier を認識させる必要がある find **/*.xcodeproj -type f | xargs sed -i "" -E 's/PRODUCT_BUNDLE_IDENTIFIER = ".+";/PRODUCT_BUNDLE_IDENTIFIER = jp.co.takeyuweb.app.stg;/g'
ここで重要なのが、この sed
コマンドは Linux の GNU版ではなく、macなのでBSD版であることです。
# GNU版だとこう find **/*.xcodeproj -type f | xargs sed -i -e 's/PRODUCT_BUNDLE_IDENTIFIER = ".\+";/PRODUCT_BUNDLE_IDENTIFIER = jp.co.takeyuweb.app.stg;/g' # BSD版だとこう find **/*.xcodeproj -type f | xargs sed -i "" -E 's/PRODUCT_BUNDLE_IDENTIFIER = ".+";/PRODUCT_BUNDLE_IDENTIFIER = jp.co.takeyuweb.app.stg;/g'
- BSD版では、置換結果でファイルを上書きする
-i
オプションの引数としてバックアップファイルの拡張子を指定する必要がある - 正規表現で使う文字をGNU版だと
\
でエスケープする必要があるが、BSD版ではエスケープできず-e
オプションの代わりに-E
オプションを使用する
私は普段macを使わないため、これを知らず数時間を無駄にしました・・・
B. PRODUCT_BUNDLE_IDENTIFIER を削除して Info.plist
の CFBundleIdentifier
に設定する
#!/bin/bash # codemagic ビルド時に bundle identifier を認識させる必要がある # Info.plist に設定して /usr/bin/plutil -replace CFBundleIdentifier -string jp.co.takeyuweb.app.stg ios/Runner/Info.plist # ios/Runner.xcodeproj/project.pbxproj に設定されているものを削除する find **/*.xcodeproj -type f | xargs sed -i "" -E 's/PRODUCT_BUNDLE_IDENTIFIER = ".+";//g'
なお、 CFBundleIdentifier
で指定しただけではだめで、 PRODUCT_BUNDLE_IDENTIFIER
を消しておかないとだめです。