🐜
Codemagic で『Invalid placeholder attributes』が出たときの対処メモ
TL;DR
Codemagic の iOS ビルドで
Simulator device failed to install the application.
Invalid placeholder attributes.
Failed to create app extension placeholder for …/ImageNotification.appex
と怒られたときは Notification Service Extension(ImageNotification) の
Info.plist
に CFBundleShortVersionString / CFBundleVersion が
プレースホルダ ($(…)
) のまま残っているのが原因。
以下の手順で xcconfig を設定 すれば解決します。
原因
- Push 通知の画像表示用に自動生成される Notification Service Extension(ImageNotification.appex)は、別ターゲットとしてビルドされる。
-
Info.plist
内のバージョンを$(FLUTTER_BUILD_NAME)
/$(FLUTTER_BUILD_NUMBER)
で参照しているが、Extension 側では Generated.xcconfig を読んでいない ためシミュレータ(実機)インストール時にInvalid placeholder attributes
で失敗する。
解決手順
1. xcconfig を用意する
# プロジェクトルート
$ touch ios/Runner/ImageNotification/Config.xcconfig
ios/Runner/ImageNotification/Config.xcconfig
// ImageNotification Extension 専用
#include? "../../Flutter/Generated.xcconfig"
ポイント
- Extension フォルダは
ios/Runner/ImageNotification/
がデフォルト。 -
../../Flutter/Generated.xcconfig
は 階層に合わせて修正。
2. Xcode で Base Configuration を設定
-
ios/Runner.xcworkspace
を開く - プロジェクトツリーに
Config.xcconfig
をドラッグ&ドロップ(Add to targets は空で OK) -
PROJECT > Runner > Info タブ > Configurations 表で Debug / Release それぞれの Based on Configuration File に
Config.xcconfig
を指定 - 念のため TARGETS > ImageNotification > Build Settings で
Base Configuration
がConfig.xcconfig
になっていることを確認
動作確認
- Codemagic で iOS ワークフローを再実行
- ログに
Invalid placeholder attributes
が出なければ成功
Extension の Info.plist に実数値が入っていれば OK。
もしまだ失敗する場合
- xcconfig の相対パスを再確認
- Build Settings フィルタが Basic で隠れていないか
- プロビジョニングプロファイルが Extension の Bundle ID と一致しているか
まとめ
Flutter + Firebase Messaging の iOS Extension は Runner とは 別ターゲット のため、xcconfig を継承しないと今回のようなエラーが出ます。一度設定してしまえば CI もローカルも安定するのでおすすめです 🛠️
Discussion