タケユー・ウェブ日報

Ruby on Rails や Flutter といったWeb・モバイルアプリ技術を武器にお客様のビジネス立ち上げを支援する、タケユー・ウェブ株式会社の技術ブログです。

codemagicのiOSビルドで Did not find matching provisioning profiles for code signing!

f:id:uzuki05:20210124010608p:plain

事象

Flutter向けのCI/CDサービスの Codemagic を使っていて、 ios/Runner.xcodeproj/project.pbxprojPRODUCT_BUNDLE_IDENTIFIERjp.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つが有効でした。

  1. PRODUCT_BUNDLE_IDENTIFIER を書き換える
  2. PRODUCT_BUNDLE_IDENTIFIER を削除して Info.plistCFBundleIdentifier に設定する

A. xcodeproj を書き換えてやる

まず、 Pre-build scriptios/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 コマンドは LinuxGNU版ではなく、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.plistCFBundleIdentifier に設定する

#!/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 を消しておかないとだめです。

関連

qiita.com