この記事で扱う内容は結局、未解決です。ご注意ください。
誰かのヒントになれば。
やりたいこと
Cloud Sigining を利用して Distributed Certificate や Provisioning Profile を管理することなく Flutter で ipa をビルドしたい。
構想
一番シンプルに考えると
flutter build ipa
したあとに Apple Store Connect API でアップロードするのが楽。 しかし色々問題があったのでまとめておく。
※ちなみにこの問題はコマンドをたたこうが、 fastlane でやろうがかわらない。
2024/04/09現在で一番有用な方法はこの記事なので要参考 - Flutter × GithubActions × DeployGateでアプリを配布する(iOS)
ただし自分はうまくいかなかった
ハマったこと
flutter build ios / ipa の違い
ios はビルドまで作ってくれる(この先はxcodebuild archive→xcodebuild -exportArchiveまでやる必要あり) ipa はipa までつくってくれる(xcodebuild -exportArchive 相当まで)
オプションをxcodebuild コマンドに渡したくなる場合は、flutter build ios のあとに自分で xcodebuild コマンドを叩くべし。
Missing Push Notification Entitlement
ITMS-90078: Missing Push Notification Entitlement - Your app appears to register with the Apple Push Notification service, but the app signature's entitlements do not include the 'aps-environment' entitlement
ipa をアップロードしたらメールがきた。これは ipa の中に aps-environment がないときにおきる。
どうも flutter build ipa
コマンドの裏で動く xcodebuild archive コマンドは、developer certificate と profile を使うようなのだが、CI環境ではそんなものはない(それを管理し出すと自動で管理できない)のでアーカイブ作成時に aps-environment をつけることができない。
これを回避するためには 「事前に developer certificate と Provisioning Profile を用意する」 しかない。でもこれは1年しか有効じゃない。
ここで CI ごとに作ればいいじゃんとおもったが、1 apple id で作れる developer certificate が2 個ぐらいのようですぐに rate limit にひっかかってしまった。
ci の並列数を調整するか、apple id をたくさん用意できるなら解消するかなと。
また事前にいれるのではなく、力技であとで書き換える方法もあった。 Flutter Build IPA not correctly setting entitlements · Issue #129075 · flutter/flutter
色々調べた限り二種類が必要なのでとてもめんどくさい。(cloud signing が対応しているのは配布の方だけ)
- アーカイブ作成に開発証明書が必要
- 配布/アップロードに配布証明書が必要
そのためいろんな記事で CODE_SIGNING_ALLOWED=NO
にするといいよと書かれているが、 ITMS-90078
を回避するためにはこれをつけてはいけない。
fastlane でプロビジョニングプロファイルがダウンロードできない
プロビジョニングプロファイルは fastlane を使うとあればダウンロード、なければ作成、expire してたら再作成が標準でできるので使ってみたが、なぜか ci 環境だとダウンロードできなかった。謎。