Macを持たずに.NET MAUIアプリをiOS向けにビルドする
.NET MAUIのアプリは、WindowsのVisual Studioで書けます。それでもiOSのビルドにはMacが必要です。Xcodeが必要だからです。Microsoftの答えはPair to Macで、SSHでMacを操作します。このページでは、当社が試したもっと簡単な方法を紹介します。Macに.NETをインストールし、ターミナルでdotnetを使ってビルドする方法です。
MAUIのiOSビルドにMacが必要な理由
MicrosoftのPair to Macのページは、はっきり書いています。iOSアプリのビルドにはAppleのビルドツールが必要で、それはMacでしか動きません。WindowsのVisual Studioは、SSHでビルドをMacに送ります。Macがアプリをコンパイルして署名します。
以前の回避策はもうありません。MicrosoftはVisual Studio for Macを2024年8月31日に終了しました。今のMacでは、dotnetのコマンドラインか、C# Dev Kitを入れたVS Codeなどのエディタを使います。
当社が試した方法:Mac上のdotnet
SSHでMacに接続し、.NET SDKをインストールします。次にMAUIのワークロードを追加してビルドします。当社のテストでは、Microsoftのインストールスクリプトと、MAUIテンプレートから作った新しいアプリを使いました。以下はワークフローのビルドジョブです。2026年10月19日に、GitHubのmacos-26 runnerでこのとおりに成功しました。
name: maui-ios
on: workflow_dispatch
jobs:
build-ios-xcode-26-6:
runs-on: macos-26
steps:
- name: Install .NET SDK 10.0.401 into the home folder
run: |
curl -sSL https://dot.net/v1/dotnet-install.sh -o dotnet-install.sh
bash dotnet-install.sh --version 10.0.401 --install-dir "$HOME/.dotnet"
echo "DOTNET_ROOT=$HOME/.dotnet" >> "$GITHUB_ENV"
echo "$HOME/.dotnet" >> "$GITHUB_PATH"
- run: dotnet --version
- name: Install the MAUI workload (workload set 10.0.401)
run: time dotnet workload install maui --version 10.0.401
- run: dotnet workload --info
- run: sudo xcode-select -s /Applications/Xcode_26.6.app
- run: xcodebuild -version && sw_vers
- run: dotnet new maui -n MauiDemo
- run: grep -n "TargetFrameworks" MauiDemo/MauiDemo.csproj
- name: Build for the iOS Simulator (Debug)
run: time dotnet build -f net10.0-ios -c Debug
working-directory: MauiDemo
- name: Build for a device, unsigned (Release, ios-arm64)
run: time dotnet build -f net10.0-ios -c Release -r ios-arm64 -p:EnableCodeSigning=false
working-directory: MauiDemo
- name: Publish for a device, unsigned
continue-on-error: true
run: time dotnet publish -f net10.0-ios -c Release -r ios-arm64 -p:EnableCodeSigning=false
working-directory: MauiDemo
- run: find bin -maxdepth 5 \( -name "*.app" -o -name "*.ipa" \) -print -exec du -sh {} \;
working-directory: MauiDemo自分のMacでは、同じコマンドをSSHで実行します。インストールスクリプトは.NETをホームフォルダに入れるので、sudoは要りません。新しいターミナルを開くたびに次の2つの変数を設定するか、~/.zshrcに追加します。
export DOTNET_ROOT=$HOME/.dotnet export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools
maui-iosではなく、mauiのワークロード全体をインストールしてください。最初の実行では、maui-iosだけを試しました。restoreがNETSDK1147で失敗しました。テンプレートはAndroidもターゲットにしていて、androidのワークロードがなかったからです。
EnableCodeSigning=falseを使うと、証明書なしでデバイス向けのビルドを試せます。できたものは、スマートフォンにも入れられず、Appleにも送れません。コードがios-arm64向けにコンパイルできることを確かめるだけです。
実行時の出力
次の行はジョブのログからそのまま写したものです。ジョブ全体は3分21秒でした。
Xcode 26.6 Build version 17F113 Workload version: 10.0.401 Successfully installed workload(s) maui. MauiDemo -> .../bin/Debug/net10.0-ios/iossimulator-arm64/MauiDemo.dll Build succeeded. Time Elapsed 00:00:23.70 MauiDemo -> .../bin/Release/net10.0-ios/ios-arm64/MauiDemo.dll Build succeeded. Time Elapsed 00:02:06.70 Created the package: bin/Release/net10.0-ios/ios-arm64/publish//MauiDemo.ipa 97M bin/Debug/net10.0-ios/iossimulator-arm64/MauiDemo.app 16M bin/Release/net10.0-ios/ios-arm64/publish/MauiDemo.ipa
シミュレータ向けのビルドは24秒でした。デバイス向けのビルドは2分を少し超えました。Releaseビルドはarm64向けに事前コンパイルするからです。
ワークロードとXcodeを合わせる
.NET for iOSの各リリースには、決まった1つのXcodeのバージョンが必要です。GitHubのdotnet/maciosにあるリリースノートに、そのバージョンが書かれています。2026年10月19日時点の.NET 10のワークロードセットは次のとおりです。
- 10.0.402.1(iOS 27.1.10018)にはXcode 27.1が必要です。2026年10月19日に、.NET SDK 10.0.402と一緒に公開されました。
- 10.0.402(iOS 27.0.10722)にはXcode 27.0が必要です。
- 10.0.401(iOS 26.5.10318)にはXcode 26.6が必要です。当社が実行したのはこの組み合わせです。
わざと間違った組み合わせも試しました。ワークロードセット10.0.402.1で、Xcode 26.6を選んだ状態にすると、ビルドは次のエラーで止まりました。
error : This version of .NET for iOS (27.1.10018) requires Xcode 27.1. The current version of Xcode is 26.6. Either install Xcode 27.1, or use a different version of .NET for iOS.
当社のMacの標準であるXcode 27.1には、リリースノートで次の組み合わせが示されています。GitHubのmacos-26のイメージにはXcode 27がないので、これは実行できませんでした。
bash dotnet-install.sh --version 10.0.402 --install-dir "$HOME/.dotnet" dotnet workload install maui --version 10.0.402.1
Microsoftが示すもう1つの方法は、複数のXcodeを入れておき、切り替えることです。どれが有効かを確認し、インストール済みのものを一覧にして、1つを選びます。
xcode-select -p ls -d /Applications/Xcode*.app sudo xcode-select -s /Applications/Xcode.app xcodebuild -version
MacRunのMacでは、/Applications/Xcode.appがXcode 26.6で、/Applications/Xcode-27.1.appが標準のXcode 27.1です。ほかのMacでは、lsが表示するアプリ名をそのまま使ってください。代わりに、1つのターミナルのセッションだけDEVELOPER_DIRを設定することもできます。MicrosoftはXcode 27での破壊的変更にも触れています。iOSアプリはUISceneのライフサイクルに対応しないと、起動時にクラッシュします。
Macで実行、署名、公開する
シミュレータでアプリを起動するには、MicrosoftのCLIガイドではRunターゲットを使います。シミュレータは、WindowsからVNCでMacの画面を見て確認します。
dotnet build -t:Run -f net10.0-ios
App Storeに出すには、署名IDとプロファイルを追加します。これはMicrosoftの例で、net8.0をnet10.0に変えたものです。当社のテストには証明書がなかったので、実行はできませんでした。
dotnet publish -f net10.0-ios -c Release -p:ArchiveOnBuild=true \ -p:RuntimeIdentifier=ios-arm64 \ -p:CodesignKey="Apple Distribution: John Smith (AY2GDE9QM7)" \ -p:CodesignProvision="MyMauiApp"
.ipaはbin/Release/net10.0-ios/ios-arm64/publishにできます。Microsoftは、アップロードにTransporterを勧めています。APIキーとTestFlightについてはMacなしでの公開ガイドをご覧ください。
Visual StudioからPair to Mac:ドキュメントにある要件
WindowsのVisual Studioのまま作業したい人もいるでしょう。その場合、Microsoftのドキュメントによると、Pair to Macには次のものが必要です。
- Macの共有設定でリモートログインをオンにし、リモートユーザーにフルディスクアクセスを許可すること。
- Xcodeをインストールし、一度開いておくこと。Pair to MacはXcodeをインストールできません。
- Monoをインストールし、AppleシリコンのMacではRosettaも入れること。
- WindowsからつながるMac。一覧に出ないときは、Add Macでアドレスを入力します。
そのあと、Visual StudioがSSHでMacに.NETをインストールします。MacRunのMacなら、アドレスはTailscaleのアドレスになります。Tailscale経由のPair to Macは試していないので、未検証として扱ってください。当社が実行したのは、上のdotnetの方法です。
この用途でMacを借りるべきでない人
- ビルドだけが必要な人。上のワークフローは、GitHubでそのまま動きます。公開リポジトリなら、標準のrunnerは無料です。GitHubの課金ページによると、非公開リポジトリではmacOSが1分$0.062です。当社の3分21秒のジョブは4分として課金され、約25セントです。
- 自分のiPhoneでデバッグしたい人。Visual Studio 2022のHot Restartなら、MacなしでDebugビルドをUSBでつないだiPhoneに入れられます。Visual Studio 2026では対応していません。
- 毎日iOSの作業をする人。毎日Macが必要なら、買ったほうが1年で見て安いかもしれません。
レンタルのMacが向いている場合
CIのジョブでは、アプリを目で見られません。レンタルのMacなら、シミュレータ、デバッガ、手で直せる署名の設定が使えます。MacRunの1日パスは、専用のM6 Mac miniが$15で、1週間は$59です。標準はXcode 27.1で、Xcode 26.6もインストール済みです。.NETは入っていません。上のコマンドでインストールします。当社のテストでは、ワークロードのインストールは34秒でした。
パスが終わるとMacのデータは消去されます。その前にコードをpushし、.ipaを手元にコピーしてください。リモートの画面の設定についてはWindowsからXcodeをご覧ください。
よくある質問
Macなしで、Windowsで.NET MAUIのiOSアプリをビルドできますか?
+
完全なビルドはできません。Microsoftのドキュメントによると、iOSのビルドツールはMacでしか動きません。Visual StudioがPair to MacでビルドをMacに送るか、Mac上で直接dotnetを使ってビルドします。
.NET 10のMAUIにはどのXcodeが必要ですか?
+
ワークロードセットによって変わります。2026年10月19日時点では、ワークロードセット10.0.402.1にはXcode 27.1が、10.0.401にはXcode 26.6が必要です。各リリースに必要なXcodeは、dotnet/maciosのリリースノートに書かれています。
MAUIのビルドで、別のXcodeが必要だと表示されるのはなぜですか?
+
ワークロードと、選択中のXcodeが合っていません。sudo xcode-select -sでXcodeを切り替えるか、dotnet workload install maui --versionで、そのXcodeに合うワークロードセットをインストールします。
Visual Studio for Macは今も使えますか?
+
使えません。MicrosoftはVisual Studio for Macを2024年8月31日に終了しました。Macでは、dotnetのコマンドラインか、C# Dev Kitを入れたVS Codeを使います。
Pair to MacはクラウドのMacで使えますか?
+
Microsoftの要件は、Windowsからつながり、リモートログインがオンになっているMacです。Tailscale経由のPair to Macは試していません。当社が試したのは、Macのターミナルでdotnetを使ってビルドする方法です。
署名なしでMAUIのiOSアプリをビルドできますか?
+
できます。当社のテストでは、-r ios-arm64と-p:EnableCodeSigning=falseを付けたdotnet buildで、証明書なしでデバイス向けのアプリができました。署名するまでは、インストールもアップロードもできません。