12k
All articles

Mac なしで iOS アプリをビルドする方法

Expo EAS、レンタルのクラウドMac、CIを使ってMacなしでiOSアプリをビルド・公開する方法を紹介。費用や署名、iPhoneでのテスト方法も比較します。

OpenReplay Team
OpenReplay Team
Mac なしで iOS アプリをビルドする方法

Mac を所有していなくても、iOS アプリの開発、ビルド、署名、リリースは可能です。ただし、実用的な方法はいずれも、Expo のビルドサーバー、レンタル Mac、CI ランナーなど、どこかで macOS を借りることになります。

Windows や Linux で開発している方なら、React Native や Capacitor のアプリが手元で動いていて、机の上には iPhone もあるのに、Getting Started ガイドには「Xcode を開いてください」と書かれている、という状況に覚えがあるでしょう。しかし、Xcode はお使いのマシンにはインストールできません。

本記事では、この問題を回避する正規の方法と、それぞれのコスト、そしてビルド後にアプリをテストする方法を解説します。クラウドでのビルドは簡単な部分です。Mac なしでのテストのほうが難しいのです。

要点

  • Xcode、codesign、iOS シミュレーターは macOS 上でしか動作しないため、Mac を使わないどの方法でも、ビルドは誰か別の Mac 上で実行されます。
  • Expo および React Native プロジェクトでは、eas build --platform ios で Expo のサーバー上でアプリのコンパイルと署名を行い、eas submit --platform ios で Windows や Linux から App Store Connect にアップロードできます。
  • App Store 向けの署名と TestFlight での配布にはいずれもメンバーシップが必要なため、どの方法を選んでも Apple Developer Program の年会費 99 ドルがかかります。
  • iOS シミュレーターは macOS アプリなので、自分の Mac がない場合は、EAS の内部配布ビルドまたは TestFlight を使って実機の iPhone でテストします。
  • Apple 製以外のハードウェアに macOS をインストールすること(Hackintosh や仮想マシン)は、Apple のライセンス条項に違反します。

なぜ Apple のビルドツールチェーンには macOS が必要なのか

Xcode、xcodebuild、codesign ツール、iOS シミュレーターは、いずれも macOS 上でしか動作しません。つまり、Mac の使用自体は避けられず、問題は「誰の Mac で処理を行うか」です。ネイティブ iOS コードのコンパイル、配布用証明書によるバイナリへの署名、App Store Connect 向けのパッケージングは、すべて Apple のツールチェーン内で行われます。以下で紹介する方法はいずれもこの制約を回避するものであり、制約そのものをなくすものではありません。

Expo EAS を使って Mac なしで iOS アプリをビルドする

React Native や Expo のプロジェクトであれば、eas build --platform ios を実行すると Expo のサーバー上でアプリのコンパイルと署名が行われます。Apple Developer Program のアカウントでサインインすれば、EAS CLI が配布用証明書とプロビジョニングプロファイルを自動生成することもできます。本記事の読者の多くにとっては、この方法が最適です。

Expo を初めて使う場合は、Getting Started with Expo から始めてください。Expo のビルドセットアップガイドに沿った一連の手順は次のとおりです。

# Create a project if you don't have one
npx create-expo-app@latest my-app
cd my-app

# Install the EAS CLI and sign in to your Expo account
npm install --global eas-cli
eas login
eas whoami            # confirms which account you're signed in as

# Generate the build configuration for the project
eas build:configure

# Build a signed iOS binary on Expo's servers
eas build --platform ios --message "First App Store build"

# Check build status and logs later
eas build:list

グローバルインストールを避けたい場合は、ドキュメントで eas と書かれている箇所を npx eas-cli@latest に置き換えて実行してください。ビルドが始まると、CLI が iOS の認証情報を管理するかどうかを尋ねてきます。「はい」と答えて Apple アカウントにサインインすれば、キーチェーンアクセスや証明書ポータルを開く必要は一切ありません。

EAS Build は、react-native や ignite-cli で作成したものを含め、Expo および React Native アプリであれば追加設定なしで動作します。Expo によれば、その他のネイティブプロジェクトにも対応しています。Capacitor については EAS の公式ガイドがないため、Capacitor を使うチームは通常、以下で紹介するいずれかの方法を採用しています。

リリースに必要なコマンドはあと 1 つだけです。

eas submit --platform ios

EAS Submit は Windows、Linux、macOS のいずれでも実行できます。ビルドを App Store Connect に送信し、Apple がアップロードの処理を完了すると、TestFlight にビルドが表示されます。この手順には有料の Apple Developer アカウントが必要です。サインインには、App Store Connect API キー、または Apple ID と App 用パスワードの組み合わせを使用します。

Xcode が必要な場合はクラウド Mac をレンタルする

クラウド Mac をレンタルすると、リモート接続経由で macOS のデスクトップ環境をフルに利用できます。ネイティブモジュールの開発、Xcode レベルのデバッグ、マネージドなビルド手段がない Capacitor プロジェクトなど、Xcode そのものが必要な場合に利用しましょう。MacStadium や MacinCloud といったプロバイダーがこうしたマシンを提供しています。自由度は高い反面、管理作業も自分で担うことになります。Xcode のインストールと更新、証明書とプロファイルの管理、ビルドスクリプトの作成はすべて自分で行います。

macOS ランナー搭載の CI を利用する

macOS ランナーを備えたホスト型 CI は、すでにビルドをスクリプト化しているチームに適しています。GitHub Actions では Linux や Windows のランナーに加えてホスト型 macOS ランナーが提供されており、他の CI プロバイダーにも同様の macOS マシンがあります。ビルドはランナーが担当しますが、署名は引き続き自分で行う必要があります。証明書とプロファイルをシークレットとして保存し、パイプラインに自分で組み込みます。Expo を使っている場合は、CI から EAS ビルドをトリガーして、Expo のマネージド署名を活用することもできます。

避けるべき方法:Hackintosh と macOS 仮想マシン

Apple 製以外のハードウェア上で macOS を動作させることは、Hackintosh であれ Windows や Linux PC 上の仮想マシンであれ、Apple のライセンス条項に違反します。macOS Tahoe ソフトウェア使用許諾契約では、Apple ブランド以外のコンピューターへの macOS のインストールおよび実行が禁止されています。macOS の仮想マシンが認められているのは、すでに macOS が動作している Mac 上のみです。どちらの方法も使わないでください。

Mac なしで iOS アプリをテストするには

iOS シミュレーターは macOS アプリであるため、自分の Mac がない場合は、EAS の開発ビルドや内部配布ビルド、または TestFlight を使って、実機の iPhone で iOS アプリをテストすることになります。ビルドはクラウドで完結できますが、Mac がないことによる本当の代償が生じるのはテストの部分です。

日常的な開発作業では、開発クライアントを追加して内部配布向けにビルドします。

npx expo install expo-dev-client

内部配布では、EAS は Ad Hoc プロビジョニングを使用します。プロファイルには承認済みデバイスの UDID(一意のデバイス ID)が記載されており、ビルドの作成時点でそのリストに含まれていたデバイスにしかインストールできません。iPhone は次のコマンドで登録します。

eas device:create

デバイスを登録したら、新しいビルドを作成してください。登録前に作成したビルドはそのデバイスにはインストールできません。これらのデバイス向けビルドは配布用証明書と Ad Hoc プロファイルで署名されており、いずれも有料の Apple Developer Program アカウントが必要です。

より広範なテストには、TestFlight を利用するとアプリごとに最大 10,000 人の外部テスターを招待できます。招待はメールまたは公開リンクの共有で行い、ビルドは事前に TestFlight App Review を通過する必要があります。

ただし、1 つ課題が残ります。Xcode によるネイティブデバッグと iOS シミュレーターには、依然として macOS が必要です。その段階に達したら、作業セッションの間だけクラウド Mac をレンタルしましょう。

コストはいくらか、どの方法を選ぶべきか

Apple Developer Program の年会費は 99 ドルで、多くの地域では現地通貨で請求されます(日本では 12,980 円)。ビルドをどこで実行するかにかかわらず、App Store 向けの署名と TestFlight での配布にはいずれもメンバーシップが必要なため、この費用は Mac を使わないすべての方法に共通してかかります。

方法macOS を運用する主体自分で管理するもの追加コスト
Expo EASExpoアプリの設定無料プランあり。EAS の料金を参照
クラウド MacレンタルプロバイダーXcode、証明書、スクリプトプロバイダーにより異なる
macOS CI ランナーCI プロバイダーパイプライン、署名用シークレットプロバイダーにより異なる

EAS の無料プランでは、月ごとに少数の iOS ビルド枠が提供され、低速のキューで処理されます。有料プランでは高速なキューを利用でき、より長時間のビルドが可能になるほか、追加料金で同時実行数を増やすこともできます。

Windows や Linux で React Native や Expo のアプリを開発するという一般的なケースでは、Expo と実機の iPhone の組み合わせをおすすめします。99 ドルのメンバーシップに登録し、EAS でビルドと署名を行い、内部配布ビルドと TestFlight でテストし、Xcode そのものが必要なときだけ Mac をレンタルしましょう。

Mac を所有しないということは、ハードウェアを購入する代わりに Apple のツールチェーンを借りるということです。ビルドとリリースはリモートで問題なく行えます。手放すことになるのは、シミュレーターとネイティブデバッグです。次のステップとして、Apple Developer Program に登録し、プロジェクトで eas build:configure を実行し、最初の内部配布ビルドを作成する前に eas device:create で iPhone を登録しましょう。

よくある質問

Mac も有料の Apple アカウントもなしで、iPhone でアプリを動かすことはできますか?

はい、プロトタイピング用途であれば Expo Go で可能です。App Store から Expo Go をインストールし、Windows または Linux で Expo プロジェクトを起動して、iPhone のカメラで QR コードをスキャンします。プロジェクトの Expo SDK バージョンは、App Store で配信されている Expo Go のバージョンと一致している必要があります。Expo Go には決まったネイティブライブラリしか同梱されていないため、それ以外のネイティブコードを含むライブラリは Expo Go 上では動作しません。リモートプッシュ通知、ユニバーサルリンク、独自のアプリ名やアイコンを使うには開発ビルドが必要で、Mac なしで iPhone に開発ビルドをインストールするには有料プログラムへの登録が必要です。

EAS の内部配布ビルドは何台の iPhone にインストールできますか?

メンバーシップ年度ごとに最大 100 台の iPhone です。Ad Hoc ビルドは Apple Developer アカウントに登録されたデバイスにのみインストールでき、Apple は製品ファミリーごとに台数を個別にカウントするため、iPhone 100 台と iPad 100 台をそれぞれ登録できます。デバイスを無効化しても登録枠は空きません。デバイスを削除して登録数を 100 台に戻せるのは、新しいメンバーシップ年度の開始時のみです。より大人数でテストする場合は、デバイス登録が不要な TestFlight を利用してください。

コードを変更するたびに新しい iOS ビルドが必要ですか?

いいえ。EAS Update を使えば、expo-updates ライブラリを含むビルドに対して、JavaScript、スタイル、画像の変更を OTA(Over-the-Air)で配信でき、ユーザーは次回のアプリ起動時に新しいバージョンを受け取ります。Swift や Objective-C のコードを含むライブラリの追加といったネイティブの変更には、引き続き新しい EAS ビルドが必要であり、ストア公開アプリの場合は App Store への再申請も必要です。また、expo-updates を最初に追加するビルド自体は、新規ビルドである必要があります。

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.