最初に結論を言うと、WindowsまたはLinuxでコードを書き、リモートMacでiOSの依存関係処理、Releaseビルド、署名、Archive、TestFlightアップロードを行う構成が現実的です。React Native CLIでiosディレクトリを持つプロジェクトなら、作業を「依存関係」「ビルド」「署名」「アップロード」に分け、最初から再実行できる形にしてください。
この手順は、WindowsやLinuxでReact Native Appを開発し、初めてiOS向け成果物を作る個人開発者向けです。ネイティブモジュールを含むプロジェクトや、継続的なリリース環境を整えたい小規模チームにも適しています。
01開発端末とリモートMacの境界を先に固定します
React Native iOSビルドで混乱しやすいのは、すべての作業をMac側へ移そうとすることです。JavaScriptやTypeScriptの編集、Git操作、Androidのデバッグは、これまで使ってきたWindowsまたはLinuxに残せます。
一方、次の工程はmacOS上のXcode環境に集約します。
iosディレクトリのネイティブ依存関係の復元- CocoaPodsによるiOSライブラリの解決
- XcodeのDebugおよびReleaseビルド
- Apple Developerの署名設定
- Archiveの作成と配布
- App Store Connectへのアップロード
React Native公式の環境設定でも、iOS開発にはXcodeを使う構成が案内されています。公式の環境構築ガイドを基準に、ローカル端末とリモートMacの役割を分けてください。
同期前に決める項目
最初に次の情報をリポジトリ単位で確定します。
- 使用するブランチとコミット
- パッケージマネージャー
- Nodeの導入方法と実行パス
- Apple Developerアカウントの権限
- Bundle ID、Team、必要なCapabilities
- 実機テストを担当する人
- 署名資産を置く場所と回収手順
プロジェクト名、ユーザー名、ホスト名、Bundle ID、Team ID、証明書名、Token、ログの保存先は、手順書では明確なプレースホルダーに置き換えます。秘密情報をリポジトリへ追加してはいけません。
02注意:リモートMacへの同期は、作業フォルダーのコピーではなく、管理されたリポジトリからの取得を基本にします。未コミット変更を手作業で移す方法は、再現性と差分確認の両方を失います。
最初の1時間でツールチェーンを揃えます
作業開始時点で、リモートMacに何が入っているかを推測しないでください。Xcode、Command Line Tools、Node、パッケージマネージャー、CocoaPodsの状態を記録します。React Native公式のiOS Simulator手順でも、Xcodeからプロジェクトを実行する流れが示されています。Simulatorの公式手順と照合してください。
1. 現在の状態を記録する
変更前に、次の情報をログへ保存します。
- Xcodeのバージョン
- 選択中のDeveloper Directory
- Nodeとパッケージマネージャーのバージョン
- CocoaPodsのバージョン
- GitのコミットID
- 利用するSchemeとConfiguration
ここで先に環境を更新しないことが重要です。失敗した場合に、元の状態へ戻せる記録がなくなるためです。
2. 固定したソースを取得する
リモートMacでは、対象ブランチを取得してからロックファイルを確認します。package-lock.json、yarn.lock、pnpm-lock.yamlなど、プロジェクトで採用しているファイルを勝手に削除しません。
Nodeの実行パスは.xcode.envなどで管理し、シェルから実行した場合とXcodeから実行した場合の差を小さくします。環境変数をログへ出す場合も、Tokenや秘密鍵の値は伏せてください。
3. JavaScriptとiOS依存関係を復元する
JavaScript依存関係をロックファイルに従って復元し、その後でiosディレクトリのCocoaPodsを処理します。ここではキャッシュ削除を先に実行しません。依存関係の解決、スクリプト実行、ネイティブモジュールのコンパイルを別々に確認できなくなるからです。
React NativeのテンプレートやXcodeの構成は変化するため、使用中のプロジェクトに合った公式手順を確認します。コマンドをそのまま貼り付けるのではなく、Package Manager、Nodeパス、作業ディレクトリを手順書へ記録してください。
03初回Debugビルドで「開発端末を離れられるか」を確認します
ここでの目的は、いきなりTestFlightへ出すことではありません。プロジェクトが元のWindowsまたはLinux端末に依存せず、リモートMacだけで復元と実行まで進むかを切り分けます。
確認する順序は次のとおりです。
- Gitから指定コミットを取得する。
- JavaScript依存関係をロックファイルから復元する。
iosディレクトリでCocoaPodsの依存関係を解決する。.xcworkspaceなど、CocoaPods導入後の正しい入口を開く。- Debug Schemeでシミュレーターを起動する。
- ネイティブモジュール、JavaScript Bundle、主要画面を確認する。
- 失敗した段階とログの先頭エラーを保存する。
シミュレーターが起動しただけで公開用ビルドが完成したとは判断しません。Debug設定、Release設定、署名、Archiveでは確認対象が異なります。
失敗の分類
- 依存関係解決で止まる:ロックファイル、Podfile、Nodeパスを確認します。
- ネイティブモジュールのコンパイルで止まる:該当Targetとライブラリ設定を確認します。
- Bundle生成で止まる:JavaScriptのエントリーポイントと環境変数を確認します。
- シミュレーター起動後に動かない:権限、URL、ネイティブ初期化を確認します。
- Releaseだけ失敗する:Scheme、Build Configuration、署名、Capabilitiesを確認します。
「全部消して再インストールする」は最後の手段です。原因の証拠まで消えるため、まずログと変更差分を保存します。
04初回ArchiveでRelease設定と署名を接続します
Debugビルドが動いたら、ReleaseのArchiveへ進みます。Appleの配布前チェックでも、配布対象の設定、署名、関連Targetを確認する流れが示されています。Xcodeの配布前チェックを使い、次の項目を順番に確認します。
- Archive対象のScheme
- Release Configuration
- Bundle ID
- Team
- Signing Certificate
- Provisioning Profile
- Push通知などのCapabilities
- App Extensionや関連Target
- バージョン番号とBuild番号
App Extensionがある場合、メインアプリだけ署名を直してもArchiveは完成しません。各TargetのBundle ID、Team、Capabilities、署名方式を確認します。
署名資産を扱う場合は、作り直す前に現在の証明書とProvisioning Profileの利用範囲を記録します。Appleはチームの署名IDを安全に共有する方法を案内しているため、署名ID共有に関するAppleの説明も確認してください。
05経験則:Build成功、Archive成功、Export可能、アップロード成功は別の状態です。XcodeのログとOrganizerの結果を分けて保存すると、署名の問題を「アップロード障害」と誤認しにくくなります。
TestFlight公開はアップロード後の処理まで確認します
Archiveができたら、Xcodeの配布機能からApp Store Connectへ送ります。Appleの公式手順では、Xcodeからベータテストやリリース向けに配布する工程が整理されています。Xcodeの配布手順を基準に、アップロード先と対象Archiveを確認します。
App Store Connect側では、次の状態を分けて記録します。
- Xcodeのアップロードが完了した
- App Store Connectのビルド処理が完了した
- 対象バージョンへビルドを関連付けた
- 内部または外部テスターへ追加した
- 実機へインストールした
- 主要機能の回帰確認が完了した
App Store Connectのアプリレコードがまだない場合は、先にアプリレコード作成の公式説明を確認します。アップロード後のビルド処理については、ビルドアップロードのヘルプに沿って確認してください。
実機確認を省略しない
リモートMac上のシミュレーターは、実機の代わりになりません。カメラ、通知、Bluetooth、決済、Sign in with Appleなど、実機条件が関わる機能は、TestFlightから端末へインストールして確認します。
Apple Developerアカウントの権限が不足している場合、Archiveまでは成功しても配布やテスター追加で止まることがあります。必要な権限を事前に確認し、個人の秘密鍵やTokenを共有チャットへ貼り付けない運用にします。
06条件分岐で運用形態を決めます
初回Archive後は、次の条件で環境を選びます。
- 今週の提出だけが目的なら、短期のリモートMacを選びます。 依存関係復元、Archive、アップロード、実機確認まで終えたら、ログと設定を保存して利用を終了します。
- 毎週または定期的にReleaseを作るなら、再利用できるリモートMacを選びます。 同じ構成を維持し、ブランチと環境変更を記録します。
- 複数人が同じ署名資産を使うなら、証明書と秘密鍵の管理手順を先に整えます。 共有方法と失効時の復旧担当が決まらない場合、常時運用へ進めません。
- 実機を接続して頻繁に確認する必要があるなら、物理アクセスを含む構成へ戻します。 画面転送だけでは端末接続や周辺機器の要件を満たせない場合があります。
- リモートセッションの切断後もビルドを続けたいなら、SSH経由の実行、ログ保存、再接続後の確認を整えます。 手動操作だけに依存する場合は、まだ継続ビルド環境とは呼べません。
短期利用の候補を確認するときは、VpsMeshのMacレンタル案内で提供条件を確認してください。長期運用を検討する場合も、料金だけでなく、引き渡し方法、接続手段、環境の保持条件を見て判断します。
07最初の1週間で再実行できる手順へ変えます
一度成功しただけでは、次のリリースで同じ結果になるとは限りません。次の作業を固定化します。
- 指定ブランチとコミットを取得する。
- NodeとJavaScript依存関係を復元する。
- CocoaPodsを実行する。
- Debugで最低限の起動確認を行う。
- Release SchemeでArchiveを作成する。
- Archive、署名、アップロードのログを保存する。
- App Store Connectの処理完了とTestFlight実機確認を記録する。
SSHが切断された場合、作業が途中で止まったのか、ビルドだけ継続しているのかを判定できるようにします。ホスト再起動後にも、同じコミットから依存関係復元とReleaseビルドを再実行してください。
Macを常用する場合は、VpsMeshのMac miniレンタル条件も比較対象になります。長期の安定した高負荷処理、物理USB接続、実機を常時扱う作業では自分でMacを購入する方が適する場合もあります。
08よくある確認事項
WindowsからiOS用のRelease成果物を作るには何が必要ですか?
Windows側ではソース編集とGit管理を行い、iOSのネイティブ工程はXcodeを備えたリモートMacへ移します。CocoaPods、Release Scheme、署名資産、Archive、App Store Connectの処理を一つずつ確認してください。WindowsだけでXcodeによるArchiveを完結させる手順ではありません。
React Native iOSビルドにMacが必要になる工程はどこですか?
JavaScriptの開発全体にMacが必要という意味ではありません。iOS依存関係の処理、Xcodeコンパイル、署名、Archive、配布、シミュレーター確認がmacOS側の工程です。特にRelease用の署名とArchiveは、Debugの起動確認だけでは代替できません。
リモートMacでCocoaPodsが失敗したら何を確認しますか?
まず作業ディレクトリ、Nodeのパス、Podfile、ロックファイル、XcodeのDeveloper Directoryを確認します。キャッシュ削除や依存関係の全面更新を先に行うと、元の原因を追えなくなります。エラーが依存関係、スクリプト、ネイティブコンパイルのどこで発生したかをログで分けてください。
TestFlightへのアップロードが終われば公開済みですか?
いいえ。Xcode側の送信完了後も、App Store Connectでビルド処理が行われます。その後、バージョンとの関連付け、テスター追加、端末へのインストール、主要機能の回帰確認が必要です。アップロード完了とTestFlightで利用可能な状態を同じものとして扱わないでください。
React Native iOSビルドを一度だけ行うなら、WindowsやLinuxを開発端末に残し、必要な期間だけリモートMacを使う方法が合理的です。ただし、現在の手作業には依存関係の再現、署名資産の保護、接続断からの復旧という負担があります。自前のMacを常時稼働させる方法は購入費用、保守、空き容量、電源や接続の管理が必要です。
定期的にReleaseを作るなら、毎回別の環境を探すより、再利用できるMac環境を確保した方が失敗箇所を減らせます。短期の提出か継続的なiOS開発かを決めたうえで、VpsMeshのMacレンタル構成を確認し、レンタル期間と引き渡し条件が自分の運用に合う場合だけ採用してください。