ガイド

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で、証明書なしでデバイス向けのアプリができました。署名するまでは、インストールもアップロードもできません。

関連ガイド