🐜

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.plistCFBundleShortVersionString / CFBundleVersion
プレースホルダ ($(…)) のまま残っているのが原因。
以下の手順で xcconfig を設定 すれば解決します。


原因

  1. Push 通知の画像表示用に自動生成される Notification Service Extension(ImageNotification.appex)は、別ターゲットとしてビルドされる。
  2. 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 を設定

  1. ios/Runner.xcworkspace を開く
  2. プロジェクトツリーに Config.xcconfig をドラッグ&ドロップ(Add to targets は空で OK)
  3. PROJECT > Runner > Info タブ > Configurations 表で Debug / Release それぞれの Based on Configuration FileConfig.xcconfig を指定
  4. 念のため TARGETS > ImageNotification > Build SettingsBase ConfigurationConfig.xcconfig になっていることを確認

動作確認

  1. Codemagic で iOS ワークフローを再実行
  2. ログに Invalid placeholder attributes が出なければ成功

Extension の Info.plist に実数値が入っていれば OK。


もしまだ失敗する場合

  • xcconfig の相対パスを再確認
  • Build Settings フィルタが Basic で隠れていないか
  • プロビジョニングプロファイルが Extension の Bundle ID と一致しているか

まとめ

Flutter + Firebase Messaging の iOS Extension は Runner とは 別ターゲット のため、xcconfig を継承しないと今回のようなエラーが出ます。一度設定してしまえば CI もローカルも安定するのでおすすめです 🛠️

Discussion