🏭

Fastlaneで外部連携された証明書をもとにプロビジョニングプロファイルを更新する方法(fastlane match import)

に公開

対象読者

  • Fastlane を使用して証明書管理を行なっている方
  • 受託開発などで、AppleDeveloperProgram が顧客側で管理されているため、証明書周りの操作に制約がある方

結論

更新対象の証明書をもらって、fastlane match importを使ってみましょう!

記事を書こうと思った経緯

Fastlane を用いて iOS の証明書等を管理していると、(Key を使用している場合は別ですが)年 1 回の配布用証明書更新を行う機会があると思います。

そこで顧客の管理しているストアでアプリリリースしている状態だと、たまにこんな機会に出くわします。

  • (権限などの都合で)顧客側で証明書を管理してもらっている
    • 証明書を新規作成するのも顧客側
  • 顧客のストアでは、こちらで開発しているアプリ以外にも複数アプリを所持している
  • 配布用証明書は共有で使用している
    • つまり、自分の都合で勝手に削除してはいけない
    • かつ、自分以外が管理しているアプリの証明書更新タイミングは選べない

私は今までの経験では、Fastlane で証明書を更新する際にはこんな手順を踏んでました。

  1. AppleDeveloperProgram 上で使用している証明書を削除する
  2. 証明書を管理しているリポジトリ上でも証明書を削除(おそらく必要)
  3. fastlane match appstoreを実行

ただし、今回のケースでは「つまり、我々の都合で勝手に削除してはいけない」制約があるのでこの手順は難しいです。
ましてやfastlane match nukeなんて実行しちゃったら怒られちゃいます。

これを解決できたのがfastlane match importでした。具体的にどんな手順を実施したのか紹介したいと思います!

fastlane match import って?

公式には以下のように記載があります。

To import and encrypt a certificate (.cer), the private key (.p12) and the provisioning profiles (.mobileprovision or .provisionprofile) into the match repo
→ 証明書 (.cer)、秘密鍵 (.p12)、およびプロビジョニング・プロファイル (.mobileprovision または .provisionprofile) を match リポジトリにインポートして暗号化する。

記載の通りで、手元にある証明書・秘密鍵・プロビジョニングプロファイルを管理リポジトリにアップロードする機能です。
これを使えば、Fastlane を経由せずに作成された証明書を使用することが可能です。

手順

ざっくり手順をまとめるとこんな感じです。

  1. 証明書とパスなしの p12 ファイルを用意する
  2. Apple Developer Portal 上で、更新対象のプロビジョニングプロファイルの証明書を付け替えて、ダウンロードする
  3. 管理リポジトリ上から証明書、プロファイルを削除 → Push する
  4. fastlane match import --type appstore で証明書を入れ替える

これらについて、詳細に説明していきます。

1. 証明書とパスなしの p12 ファイルを用意する

p12 ファイルを選択し、パスワードを入力することでキーチェーンアプリに証明書が追加されます。
証明書が表示されないときはキーチェーンアプリを再起動してみてください。
その状態で証明書を右クリック →「"${証明書名}"を書き出す」を選択するとファイル保存ができるので、証明書(.cer)を選択します。
save_cer
その後、再度キーチェーンアプリ上で証明書と秘密鍵を両方選択した状態で右クリック →「2 項目を書き出す」を選択して、次は個人情報交換(.p12)を選択します。
その後パスワード設定画面が表示されますが、パスワードは設定しないで保存してください
Fastlane ではパスワード付きの p12 ファイルは対応していないようなので、importまではうまくいくのですが、その後にいざ配布時に証明書を使用すると下記のような形で証明書の参照で失敗します。(参考: Importing p12 files with password in Match #19814)

失敗ログ
[11:49:22]: ▸ Archiving xxxxx...
[11:49:24]: ▸ Automatically signing iOS for device deployment using specified development team in Xcode project: xxxxx
[11:49:44]: ▸ Running pod install...                                              7.4s
[11:50:02]: ▸ Running Xcode build...
[11:50:02]: ▸ Xcode archive done.                                         17.6s
[11:50:03]: ▸ Failed to build iOS app
[11:50:03]: ▸ Error (Xcode): Provisioning profile "match AppStore xxxxx" doesn't include signing certificate "Apple Distribution: xxxxx (xxxxx)".
[11:50:03]: ▸ /Users/runner/work/xxxxx/xxxxx/ios/Runner.xcodeproj
[11:50:03]: ▸ It appears that there was a problem signing your application prior to installation on the device.
[11:50:03]: ▸ Verify that the Bundle Identifier in your project is your signing id in Xcode
[11:50:03]: ▸ open ios/Runner.xcworkspace
[11:50:03]: ▸ Also try selecting 'Product > Build' to fix the problem.
[11:50:03]: ▸ Encountered error while archiving for device.

これで証明書の下準備は終わりです。
それぞれ保存した証明書、p12 の場所はこの後パス指定するので覚えておいてください。

2. Apple Developer Portal 上で、更新対象のプロビジョニングプロファイルの証明書を付け替えて、ダウンロードする

Apple Developer Portal にアクセスして、 https://developer.apple.com/account/resources/profiles/list から対象のプロファイルを見つけて、詳細画面で証明書の付け替えを行います。
そのプロファイルをダウンロードして、先程同様に保存場所を覚えておいてください。

3. 管理リポジトリ上から証明書、プロファイルを削除 → Push する

Fastlane 管理リポジトリで、今回更新対象の証明書とプロファイルを削除して、Push してください。

4. fastlane match import --type appstore で証明書を入れ替える

Fastlane 管理リポジトリ上で、fastlane match import --type appstoreを実行します。--typeはプロファイルと証明書の種別を表しており、デフォルトは development(開発者用)になっているため、今回の配布用証明書のケースだと、適切な証明書を import しようとしても下記のように失敗します。

[!] This certificate cannot be imported - the certificate contents did not match with any available on the Developer Portal

fastlane match import --type appstoreを実行すると、証明書、p12、プロビジョニングプロファイルの順番にパスを聞かれるので、先ほどまでの手順で控えたパスを指定してください。

[20:04:46]: Certificate (.cer) path:
xxxxx/xxxxx/xxxxx.cer
[20:05:09]: Private key (.p12) path:
xxxxx/xxxxx/xxxxx.p12
[20:05:38]: Provisioning profile (.mobileprovision or .provisionprofile) path or leave empty to skip this file:
xxxxx/xxxxx/xxxxx.mobileprovision

成功すると、それぞれ更新された状態の証明書群がリポジトリに適用されます 🎉

補足

証明書・プロファイルを Fastlane を使って更新することも可能

  • 自分たちで新規証明書を作ってもいい場合は、fastlane certによる作成も可能です
  • 手順 2 の Apple Developer Portal でのプロファイル情報の更新は、事前にfastlane certfastlane match import --type appstore でリポジトリの証明書を更新していれば、fastlane match --cert_id {取り込んだ証明書のID}でも更新可能です
    • ただしこの時 Apple Developer Portal 上に既存の証明書が残っていると、その証明書は残ったまま新規でサフィックスのついた証明書が生成されてしまうため、事前削除を推奨します

そもそも Apple Developer Portal にアクセスできない場合

色々な都合でそもそも Apple Developer Portal にアクセスできない場合はfastlane match import --skip_certificate_matching trueで証明書の有効性チェックやプロビジョニングの紐付けの確認のための Apple Developer Portal へのアクセスをスキップして生成できるようです

参考:
https://qiita.com/hugehoge/items/f8994d3d1b04dd4a3245

最後に

Fastlane でせっかく証明書の管理を楽にしていても、結構権限の制約とかで困ったりすることがあると思います。
そんな時の一つの解決策になればと思います!

ENECHANGE

Discussion