Written by Martin Jeret
本記事で、LinuxやWindowsで作業している場合にiOSアプリをビルドして公開する方法をご紹介いたします。FlutterとCodemagicを使って、どのようにそれが可能なのかをお知りください。
要注意! iOSアプリを開発することと、Codemagicでアプリを構築して公開するのは異なります。
iOS向けアプリケーションの開発は、Macコンピューターなしには考えられません。これがすぐに変わる気配はありませんが、Macを持っていなくても、iOS用にアプリをビルドしてApp Storeにリリースする方法は複数ございます。FlutterとCodemagicをお使いいただくと、Macコンピューターを購入しなくても、iOSアプリを構築して配布することが可能です。
本記事では、LinuxまたはWindowsでFlutterアプリを作成し、Codemagic CI/CDを使用してiOSプロジェクトにコード署名を設定し、アプリケーションをApp Storeにリリースする方法についてご説明いたします。この例では、CodemagicサンプルプロジェクトにあるFlutter iOSアプリを使用する予定です。
必要なもの
- アプリのコード署名と公開には、Apple Developer Programのライセンスを購入する必要があります
- また、アプリケーションのスモークテストを行うには、iOS端末を用意する必要があります
始める前に、どのような問題を解決しようとしているのかを明確にすることが重要です。Macコンピューターがないと、iOSアプリを開発することはできません。本記事では、iOSアプリを構築し、ユーザーにリリースする方法についてご説明いたします。でも、何が違うんでしょうか?
まず、解決策を考える前に、問題提起とユースケース例について詳しく見ていきましょう。機能開発に着手する前に、その背景を理解するためのユーザーストーリーとお考えください。
iOSアプリケーションの開発にLinuxやWindowsマシンを使えない場合とは?
おそらくお察しの通り、iOSシミュレータの所持や、iOS特有の問題をmacOS上でデバッグするのは、非常に貴重なことです。さらに、ユーザーがバグを記録した場合、その問題を再現できる必要があり、報告された問題はプラットフォーム固有のものである可能性が高いです。
すべてのアプリに共通する機能で、最も悪名高いものの1つは、プッシュ通知だと言えるでしょう。ほとんどの場合、iOSシミュレータで十分ですが、一部、アプリケーションを実機でテストすべきシナリオもあり、プッシュ通知もその一つです。
MacコンピューターがなくてもiOSアプリケーションを構築して公開できる場合とは?
Flutterの大きな利点は、iOSや他のOSのためだけに、全く新しいアプリケーションを作る必要がなく、既存のプロジェクトを使ってすべてのプラットフォームに配布できることです。
中古のMacを購入して開発環境を整えることもできますし、Codemagicなどの無料サービスを利用してiOSバイナリを構築し、iOS端末でスモークテストを行ったり、最初のユーザーと共有したりすることも可能です。これは、素早く動いて、アプリを出すのに最適な方法です。
macOSユーザー様で、マイクロソフトパートナーセンターにデスクトップ版アプリのリリースをご検討の場合は、発想を逆にしてみてください。アプリケーションを構築するのにWindowsマシンを買いに行くこともできますし、既存のCI/CDツールを使って、インスタンスタイプをWindowsに切り替えることもできます。
次によくあるのが、チームで仕事をしていて、チームメンバーの中にMacのコンピューターを持っている人とLinuxやWindowsのコンピューターを持っている人がいる場合です。PRをマージする準備ができたら、他の人にバイナリのビルドを依頼したりQAにやらせたりするのではなく、CIがすべてのプラットフォームに向けてビルドし、自動的にQAチームとバイナリを共有するのが最高ですね。
LinuxまたはWindowsでのFlutterアプリの開発
Flutterはマルチプラットフォーム対応のアプリケーション開発フレームワークで、特にiOSとAndroidのアプリケーションを同じソースコードから開発することを可能にします。ただし、iOSアプリを作るにはXcodeを使う必要があり、XcodeはmacOSでしか動きません。LinuxやWindowsではどうにもなりません。ですが、CodemagicのようなCI/CD製品をお使いいただくと、Google Play StoreやApple App Storeにアプリをビルドして配布することが可能です。
FlutterとCodemagicを組み合わせることで、LinuxやWindowsを使用する開発者様が、iOSアプリをリリースすることができるようになります。
Flutter向けの開発環境の構築
早速、Android SDKとFlutterをインストールしましょう。その後、GitHubからCodemagicのサンプルプロジェクトのリポジトリをクローンすると、すぐにでも作業を開始できます。私たちはFlutterのAndroidとiOSのデモプロジェクトを使用する予定です。Flutterの入門ガイドは、公式サイトのFlutterドキュメントでも公開されています。
ご注意いただきたいのは、LinuxやWindowsを使用して、iOSではなく、Androidのみを対象とした開発を行うことができることです。この記事の最後には、App StoreにデプロイできるiOSアプリを取得しますが、それを達成するために、macOS環境でCodemagic CI/CDを使用いたします。
Codemagicにアプリケーションを追加
サインアップ後、**アプリケーションを追加(Add application)**ボタンをクリックすると、リポジトリを接続できます。
ドキュメントリンク。リポジトリがセルフホストの場合やファイアウォールの内側にある場合は、こちらのドキュメントをご参照ください。
最初のビルドを実行
ではビルドを実行して、“My first green build!(初めてのグリーンビルド(青信号、成功ビルド))“とプリントしてみましょう!
- Flutterのワークフローエディタを開き、**テストのみ実行(Run tests only)**を選択します。
- **テスト(Tests)**セクションでテストが無効になっていることを確認します。
- **配布(Distribution)セクションの後にある+**ボタンを開き、次のように記述します:
#!/bin/sh
echo "My first green build!"
- 変更を保存します。
- ビルドを開始します。
残念… ビルドは失敗しました。クローンしたリポジトリのルートに pubspec.yaml
ファイルがない、というエラーメッセージが表示されています。確かにそうです。これはモノレポ(複数プロジェクトのコードベースを同一レポジトリで管理すること)だからです。Codemagicに、作業ディレクトリに使用するパスを教えるにはどうしたらよいでしょうか?
- ワークフローエディタを開きます。
- **ビルド(Build)**セクションに移動し、**プロジェクトパス(Project path)**フィールドでFlutterデモプロジェクトを選択します。
- 変更を保存します。
- ビルドを開始します。
成功です!
iOSプロジェクトの構築
さて、最初のグリーンビルド(成功ビルド)ができたので、iOSプロジェクトのビルドに挑戦してみましょう。
- ワークフローエディタを開きます。
- iOSをビルドプラットフォームとして選択します。
- **ビルド(Build)**セクションで、使用するXcodeのバージョン、CocoaPodsのバージョン、Flutterのバージョンを選択します。
- 設定を保存します。
- ビルドを開始します。
- 幸運を祈ります。
本記事執筆時点(2022年2月3日)では、Xcode 13.2.1、Flutter 2.8.1を使用しています。
このガイドに従ってご自分のアプリケーションを作成する場合、別のビルドの失敗が発生する可能性があります。
iOSプロジェクトをビルドしたことがない場合、Podfileの生成やXcodeのグラフィカルユーザーインターフェイス(GUI)のちょっとした変更で、よくある問題が発生する場合がございます。CodemagicのmacOS仮想マシンにリモートアクセスし、新しいファイルを初期化し、変更をリポジトリにプッシュできます。接続が完了したら、ターミナルから以下のコマンドを実行します。例えば、Podの初期化はこのようになります:
cd iOS
pod init
gh auth login --with-token YOUR_GITHUB_PAT_TOKEN
git add .
git commit -m "Added Podfile"
git push
リモートアクセスの使用方法については、こちらのドキュメントをご参照ください。
変更をご自分のリポジトリにプッシュするには、ご自身のgitプロバイダーでの認証が必要です。これは、Codemagic VMはGitHubレポへの読み取りアクセスしかできないため必要です。GitHubで認証を行うには、GitHubのパーソナルアクセストークンを使用する必要があります。https://github.com/settings/tokens からトークンの生成方法をご参照ください。
これで.ipa
ファイルの入手に一歩近づきました!
.ipaファイル
.ipa
は、Androidの.apk
のような物理デバイス上で実行できるバイナリです。macOS以外では.ipa
バイナリを作成できません。この障害を克服する方法は、macOS環境での継続的インテグレーションとデリバリーサービスを利用することです。Xcodeでコード署名を行い、.ipa
バイナリをビルドし、後でApp Store Connectに公開できるように、Codemagic CI/CDをセットアップする必要があります。
ローカルマシンでのコード署名用にiOSプロジェクトを準備
CI/CD環境で機能させるには、絶対パスの代わりに相対パスを使用するようにGradleを設定する必要があるのと同様に、私たちのiOSプロジェクトにもいくつか変更を加える必要があります。
-
Apple Developerポータルのhttps://developer.apple.com/account/resources/identifiers/listからバンドルIDを登録します。
-
https://appstoreconnect.apple.com/appsにアプリレコードを作成し、先ほど作成したバンドルIDを使用します。
-
iOS プロジェクトをエディタで開き、
project.pbxproj
ファイルを開いて、アプリケーションのPRODUCT_BUNDLE_IDENTIFIER
を先ほど作成したバンドルIDに設定します。これはこのプロジェクト内の複数の場所で言及しておりますので、どこでも変更するようにしてください。ファイルはMacがなくても編集可能です。 -
ボーナスポイント:Codemagicでビルドを自動的にトリガーするためのウェブフックを設定します。ワークフローエディタを開き、ビルドトリガーを、マスターへのプッシュ時にビルドするように設定します。
-
ローカルマシンのターミナルから、
project.pbxproj
ファイルに加えた変更を保存し、リポジトリのマスターに変更をプッシュします。ウェブフックをすでに設定済みの場合、このプッシュからCodemagicのビルドが起動するのも確認できるはずです。
フレーバーをご使用の場合、この件に関しては別のこちらの記事で取り上げております。また、サンプルプロジェクトはGitHubで、こちらで公開しております。
FirebaseなどGoogleサービスをご利用の場合は、VNCでリモートで仮想マシンにアクセスし、GoogleService-info.plist
ファイルを、XcodeでiOSプロジェクトに追加する必要があります。iOSプロジェクトにFirebaseを追加する方法については、当社のブログのこちらの記事で公開しております。
iOSのコード署名を始める
スタック・オーバーフローのiOSコード署名に関する質問の数から判断すると、多くの開発者様がiOSのコード署名に苦労されているのがわかります。コード署名の設定は、特にMacなしでCI/CD環境で動作させようとすると、頭痛の種になることがあることを私たちは理解しております。
iOSアプリに署名するには、Appleの開発者アカウント(冒頭で述べた要件の1つ)、開発証明書と配布証明書、アプリID、および一致するプロビジョニングプロファイルが必要です。
WWDC 2019以降、これらの署名ファイルを生成するために、App Store Connect APIを使用することが可能になりました。私たちは、そのAPIに加えて独自のCLIツールを構築しており、Codemagicは、コード署名と公開を容易にするために、これらを見えにくいところで使用しています。このCLIツールは、GitHubでオープンソース化しております。
CodemagicでのApp Store Connectの統合設定
さて、無事にiOSプロジェクトのビルドとコード署名の設定が終わったところで、CodemagicでもiOSのコード署名を有効にしましょう。
そのために、App Store Connectのインテグレーションを利用することにします。つまり、Apple開発者ポータルでAPIキーを作成する必要があります。
- ワークフローエディタを開き、配布(Distribution) > iOSのコード署名(iOS code signing)に進みます。
- プロンプトに従って、App Store Connectインテグレーションを設定します。
- Apple開発者ポータル > [ユーザーとアクセス]にアクセスします。
- キーセクションでApp Store Connect APIキーを作成し、Codemagicにアップロードして、Apple開発者ポータルで認証します。
- Codemagic App Store Connectインテグレーションを完成させます。
Codemagicで使用するための専用キーの作成をお勧めいたします。自動でコード署名を行うには、Developerロールでキーを作成します。App Store Connectへの公開にもインテグレーションを使用するには、App Managerロールが必要です。この例では、App Store Connectに公開し、App Managerロールでキーを作成します。
- App Store Connect APIキーの名前は、Codemagicでのキーと区別しやすい名前です。
- 発行者(Issuer)IDは、APIキーテーブルの上にある英数字で、誰が認証トークンを作成したのかを識別するためのものです。
- APIキーテーブルからKey IDを見つけられます。
- APIキーは.p8キーファイルで、App Store Connectからダウンロードできます。なお、キーのダウンロードは1回のみ可能です。
ドキュメントへのリンク
.ipaファイルのビルドとApp Store Connectへの公開
App Store Connectのインテグレーションが有効になったので、Codemagic を使ってコード署名ファイル(証明書とプロビジョニングプロファイル)を生成し、.ipa
を生成できます。
- ワークフローエディタを開きます。
- **配布(Distribution)> iOS コード署名(code signing)**に移動します。
- 自動コード署名(automatic code signing)を選択します。
- APIキーを選択します。
- プロビジョニングプロファイルの種類をApp Storeに選択します。
- バンドル識別子を選択します。
- 変更を保存します。
- App Store Connectセクションを開き、App Store Connectの公開を有効にします。また、先ほど作成したAPIキーを必ず選択してください。
新規ビルドを開始します。
また、追加のエラーが発生する場合もあります。
このようなエラーメッセージが表示されてビルドに失敗する場合は、アカウントに既存の配布証明書が多すぎることを意味します。使用されていないものを削除するか、手動コード署名を選択し、こちらのドキュメントに従って既存のプロファイルと配布証明書をアップロードできます。
GUIワークフローエディタではなく、.yaml
ファイルによる設定の使用を選択した場合、使用している配布証明書の秘密鍵を指定することもできます。ドキュメントへのリンク
結論
FlutterのようなSDKを使うと、多くのプラットフォームでアプリケーションを開発できます。Codemagic CI/CDでは、すべてのターゲットプラットフォーム向けに(ストアであれ、チーム内共有であれ)アプリケーションを自動的にビルドしてリリースすることで、チームとコラボし、迅速に作業を進められます。
リリース前に必ずアプリをテストし、構築する対象のネイティブOSにアクセスできるようにしてください。