フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Flutter/ios】cloud signing を利用したビルドがうまくいかない

この記事で扱う内容は結局、未解決です。ご注意ください。

誰かのヒントになれば。

やりたいこと

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 環境だとダウンロードできなかった。謎。