Fsatlaneでリリースしていたアプリをexpoにマイグレーションする

現状
- Fastlaneで以下の証明書(Certificate)を作成している
- 開発用証明書(Development)
- 配布用証明書(Distribution)
- プロビジョニングプロファイル(Development, AdHocではない)
- プッシュ通知証明書
- Fastlaneの証明書はリポジトリで管理している
課題
- Fastlaneが作成した証明書をそのままexpoでも使いたい
- 本番用証明書を他アプリでも使っているため
- ストアリリース済みのアプリと同じbundleIdentifierを使いたい
- 新規アプリにしたくないため
※ とりあえずios、とりあえずプッシュ通知はパス

expoのドキュメント、認知負荷が高いのでMCP作ってくれ。

とりあえずManaged Workflowを試す。
expoによって証明書・プロビジョニングプロファイルを新規に定義される?
bundleIdentifierが同じなので、証明書が存在すればそこを見てくれる?
eas build --platform ios --profile preview
結果 →
だめだった。既存の配布用証明書が削除され、紐づいていたプロビジョニングプロファイルがrevokeされた。あああああああああ

最悪削除されたとしてもリリース済みアプリに影響はない(し、リリース作業中のチームもいない)という見込みだったが、その最悪を引いてしまったのが...。
fastlaneで各種証明書を再作成してもらった。
インシデント発生させたので反省する。

方針をManual Workflowにする。

ドキュメントから以下のファイルがあれば良さそうなので、探す。
- 証明書 →
.p12
ファイル - 証明書に紐づくプロビジョニングプロファイル →
.mobileprovision
ファイル
プロビジョニングプロファイルはそれっぽいファイルをダウンロードできたが、証明書は....cer
ってなんだ(この程度の知識でここまで進めていたことが恐ろしい)。

cerが証明書で、p12が秘密鍵らしい(chatGPT)。
cerだけあってもp12は取得できないらしい。
このルートは大変そうなので、fastlaneから証明書を取得できないか試す。
fastlaneはcertificate
リポジトリに証明書置いているらしい。
p12ファイルある。勝った。

CLIからアップロードを試す。
eas credentials
結果 →
だめだった。
CLIで以下のようなエラーが発生してアップロードできない。
Provided Distribution Certificate is no longer valid on Apple's server

コンソールからアップロードを試す。
結果 →
だめだった。アップロードは成功するが、ビルドが通らない。
expoのクラウドビルドで以下のエラーが発生する。
Distribution certificate with fingerprint xxxx hasn't been imported successfully

以降、上記エラーに延々と悩まされる。
プロビジョニングプロファイルと証明書の組み合わせか?と思い、いろいろ試すが、すべて同じフィンガープリント不整合で弾かれる。
諦めてChatGPTに聞くと、fastlaneの証明書は暗号化されているらしい。

とりあえずローカルのキーチェーンに登録すれば良いはず。
fastlane match develop --readonly
キーチェーン「自分の証明書」からp12ファイルを書き出すことができた。
ファイルはたしかにバイナリで、リポジトリのp12ファイルがプレーンテキストで閲覧できていたことを思い出し、涙する。
よくあることだけど、最初からこうすれば良かったと、理解したあとに思う。

書き出したp12ファイルをCLIからアップロードしようとすると、別のエラーが発生した。諦めてコンソールからアップロードするが、結局フィンガープリントエラーが発生する。
と、ここにきて開発要証明書はアップロードできないんじゃないか、と気づく。
試しに配布用証明書をCLIからアップロードしたら、できた。
結論、復号化した配布用p12ファイルが、正解だったらしい。

配布用p12ファイルでCLIからアップロードができたが、依然としてフィンガープリントエラーが発生し途方にくれる。
ここで先輩(fastlane構築者)から助け舟で、fastlaneでAdHocのプロビジョニングプロファイルを作ってみる?と提案される。
ここまでの試行ではプロビジョニングプロファイルはexpoが新規に作成したものを使っていた。勝手に証明書と紐づくものだと思っていたので。
現に、Appleコンソール上での表示は正しく証明書と紐づいており、ローカルで作成されたプロビジョニングプロファイルと証明書のフィンガープリントを検証しても一致していた(はずなんだけどなあ)。

fastlaneからAdHocプロビジョニングプロファイルを作成。
該当のプロビジョニングプロファイルをダウンロード・リネームし、credentials.json
を使ってアップロード。
配布用p12ファイルの再作成も行った。
{
"ios": {
"distributionCertificate": {
"path": "credentials/ios/dist-cert.p12",
"password": "xxxxxx"
},
"provisioningProfilePath": "credentials/ios/profile.mobileprovision"
}
}
eas credentials
✔ Select platform › iOS
✔ Which build profile do you want to configure? › preview
✔ Using build profile: preview
If you provide your Apple account credentials we will be able to generate all necessary build credentials and fully validate them.
This is optional, but without Apple account access you will need to provide all the missing values manually and we can only run minimal validation on them.
✔ Do you want to log in to your Apple account? … yes
✔ Logged in Local session
✔ What do you want to do? › Build Credentials: Manage everything needed to build your project
✔ What do you want to do? › credentials.json: Upload/Download credentials between EAS servers and your local json
✔ What do you want to do? › Upload credentials from credentials.json to EAS
✔ Would you like to replace this configuration with credentials from credentials json? … yes
結果 →
成功 🙌

ここまでの結論
- expoに設定できるのは「配布用証明書(.p12)」と「プロビジョニングプロファイル(.mobileprovision)」
- fastlaneで定義された証明書を取得するのはmatchしてキーチェーン
- プロビジョニングプロファイルはfastlaneがAdHocとして作成したものを使う
考察
証明書として配布用と開発用の違いもわかっていなかったが、配布ビルドも結局はAdHocでの配布になることを考えればよかった。
また、fastlane作成のAdHocプロファイルにして正常化したのは、fastlane関係なく、証明書のみが存在する状態でexpoが新規に作成するプロファイルに問題があるように思うが、推測の域を出ない。
とはいえ、CLIを介した各種設定は直感的で、やっぱexpo使いやすいなという印象。
TODO
- androidのストア提出用設定
- プッシュ通知用証明書の登録作業
- ただ、expoのプッシュ通知基盤を使うので、登録いらないんじゃないかと思っている