Panduan

Build aplikasi .NET MAUI untuk iOS tanpa punya Mac

Anda bisa menulis aplikasi .NET MAUI di Visual Studio di Windows. Build iOS tetap butuh Mac, karena butuh Xcode. Jawaban Microsoft adalah Pair to Mac, yang mengendalikan Mac lewat SSH. Halaman ini menunjukkan jalur yang lebih sederhana yang kami uji: pasang .NET di Mac dan build dengan dotnet di terminalnya.

Kenapa MAUI butuh Mac untuk iOS

Halaman Pair to Mac dari Microsoft menyatakannya dengan jelas. Build aplikasi iOS butuh tool build dari Apple, dan tool itu hanya jalan di Mac. Visual Studio di Windows mengirim build ke Mac lewat SSH. Mac yang mengompilasi dan menandatangani aplikasinya.

Cara lama untuk menghindarinya sudah tidak ada. Microsoft menghentikan Visual Studio for Mac pada 31 Agustus 2024. Di Mac sekarang Anda memakai command line dotnet, atau editor seperti VS Code dengan C# Dev Kit.

Jalur yang kami uji: dotnet di Mac

Hubungkan ke Mac lewat SSH dan pasang .NET SDK. Lalu tambahkan workload MAUI dan build. Test kami memakai skrip instalasi Microsoft dan aplikasi baru dari template MAUI. Ini job build dari workflow itu, persis seperti yang berhasil di runner macos-26 GitHub pada 19 Oktober 2026.

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

Di Mac Anda sendiri, jalankan perintah yang sama lewat SSH. Skrip instalasi menaruh .NET di folder home Anda, jadi tidak butuh sudo. Atur dua variabel ini di setiap terminal baru, atau tambahkan ke ~/.zshrc:

export DOTNET_ROOT=$HOME/.dotnet
export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools

Pasang workload maui yang lengkap, bukan maui-ios. Run pertama kami mencoba maui-ios saja. Restore gagal dengan NETSDK1147, karena template itu juga menargetkan Android dan workload android tidak ada.

EnableCodeSigning=false memungkinkan Anda menguji build perangkat tanpa sertifikat. Hasilnya tidak bisa dipasang di ponsel atau dikirim ke Apple. Ini hanya membuktikan kode Anda bisa dikompilasi untuk ios-arm64.

Apa yang dicetak run itu

Baris berikut disalin dari log job. Seluruh job memakan waktu 3 menit 21 detik.

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

Build simulator memakan waktu 24 detik. Build perangkat memakan waktu sedikit lebih dari 2 menit, karena build Release mengompilasi lebih dulu (ahead of time) untuk arm64.

Cocokkan workload dengan Xcode

Setiap rilis .NET untuk iOS butuh satu versi Xcode yang pasti. Catatan rilis di GitHub, di dotnet/macios, menyebutkannya. Per 19 Oktober 2026, ini workload set untuk .NET 10:

  • 10.0.402.1 (iOS 27.1.10018) butuh Xcode 27.1. Versi ini keluar pada 19 Oktober 2026, bersama .NET SDK 10.0.402.
  • 10.0.402 (iOS 27.0.10722) butuh Xcode 27.0.
  • 10.0.401 (iOS 26.5.10318) butuh Xcode 26.6. Ini pasangan yang kami jalankan.

Kami juga sengaja menjalankan pasangan yang salah. Dengan workload set 10.0.402.1 dan Xcode 26.6 terpilih, build berhenti dengan error ini:

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.

Untuk Xcode 27.1, default di Mac kami, catatan rilis memberi pasangan ini. Kami tidak bisa menjalankannya, karena image macos-26 GitHub tidak punya Xcode 27.

bash dotnet-install.sh --version 10.0.402 --install-dir "$HOME/.dotnet"
dotnet workload install maui --version 10.0.402.1

Solusi lain dari Microsoft adalah menyimpan beberapa Xcode dan berganti di antaranya. Periksa mana yang aktif, tampilkan yang terpasang, lalu pilih satu:

xcode-select -p
ls -d /Applications/Xcode*.app
sudo xcode-select -s /Applications/Xcode.app
xcodebuild -version

Di Mac MacRun, /Applications/Xcode.app adalah Xcode 26.6 dan /Applications/Xcode-27.1.app adalah Xcode 27.1, yang menjadi default. Di Mac lain, pakai nama aplikasi persis yang dicetak oleh ls. Anda juga bisa mengatur DEVELOPER_DIR untuk satu sesi terminal saja. Microsoft juga mencatat breaking change untuk Xcode 27. Aplikasi iOS harus memakai lifecycle UIScene, atau aplikasinya crash saat dibuka.

Jalankan, sign dan publish di Mac

Untuk membuka aplikasi di Simulator, panduan CLI Microsoft memakai target Run. Anda melihat Simulator lewat layar Mac, dari Windows lewat VNC.

dotnet build -t:Run -f net10.0-ios

Untuk App Store, tambahkan identitas signing dan profil Anda. Ini contoh dari Microsoft dengan net8.0 diganti menjadi net10.0. Kami tidak bisa menjalankannya, karena test kami tidak punya sertifikat.

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"

File .ipa muncul di bin/Release/net10.0-ios/ios-arm64/publish. Microsoft menyarankan Transporter untuk upload. Panduan kami tentang publish tanpa Mac membahas API key dan TestFlight.

Pair to Mac dari Visual Studio: syarat menurut dokumentasi

Anda mungkin lebih suka tetap di Visual Studio di Windows. Pair to Mac lalu butuh hal berikut, menurut dokumentasi Microsoft:

  • Remote Login aktif di pengaturan Sharing Mac, dengan full disk access untuk pengguna remote.
  • Xcode terpasang dan sudah dibuka sekali. Pair to Mac tidak bisa memasang Xcode.
  • Mono terpasang, dan Rosetta di Mac Apple silicon.
  • Mac yang bisa dijangkau Windows. Jika tidak tercantum, pakai Add Mac dan ketik alamatnya.

Visual Studio lalu memasang .NET di Mac lewat SSH. Di Mac MacRun, alamatnya adalah alamat Tailscale-nya. Kami belum menguji Pair to Mac lewat Tailscale, jadi anggap itu belum teruji. Jalur dotnet di atas adalah yang kami jalankan.

Siapa yang sebaiknya tidak menyewa Mac untuk ini

  • Hanya build. Workflow di atas jalan di GitHub apa adanya. Repository publik tidak membayar apa pun untuk runner standar. Repository privat membayar $0.062 per menit untuk macOS, menurut halaman tagihan GitHub. Job kami yang 3 menit 21 detik ditagih 4 menit, sekitar 25 sen.
  • Debug di iPhone Anda sendiri. Hot Restart di Visual Studio 2022 memasang build Debug ke iPhone lewat USB tanpa Mac. Fitur ini tidak didukung di Visual Studio 2026.
  • Kerja iOS harian. Jika Anda butuh Mac setiap hari, membeli satu mungkin lebih murah dalam setahun.

Kapan Mac sewaan cocok

Job CI tidak bisa menampilkan aplikasinya. Mac sewaan memberi Anda Simulator, debugger dan setup signing yang bisa Anda perbaiki sendiri. Pass harian MacRun adalah Mac mini M6 khusus seharga $15, dan seminggu seharga $59. Xcode 27.1 menjadi default dan Xcode 26.6 juga terpasang. .NET belum terpasang. Anda memasangnya dengan perintah di atas. Instalasi workload memakan waktu 34 detik dalam test kami.

Mac dihapus saat pass berakhir. Push kode Anda dan salin .ipa Anda sebelum itu. Lihat Xcode dari Windows untuk setup layar jarak jauh.

Pertanyaan yang sering diajukan

Bisakah saya build aplikasi iOS .NET MAUI di Windows tanpa Mac?

+

Tidak untuk build lengkap. Dokumentasi Microsoft bilang tool build iOS hanya jalan di Mac. Visual Studio mengirim build ke Mac lewat Pair to Mac, atau Anda build langsung di Mac dengan dotnet.

Xcode mana yang dibutuhkan .NET 10 MAUI?

+

Tergantung workload set-nya. Pada 19 Oktober 2026, workload set 10.0.402.1 butuh Xcode 27.1, dan 10.0.401 butuh Xcode 26.6. Catatan rilis dotnet/macios menyebutkan Xcode untuk setiap rilis.

Kenapa build MAUI saya bilang butuh Xcode yang berbeda?

+

Workload Anda dan Xcode yang terpilih tidak cocok. Ganti Xcode dengan sudo xcode-select -s, atau pasang workload set yang cocok dengan Xcode Anda lewat dotnet workload install maui --version.

Apakah Visual Studio for Mac masih tersedia?

+

Tidak. Microsoft menghentikan Visual Studio for Mac pada 31 Agustus 2024. Di Mac, pakai command line dotnet atau VS Code dengan C# Dev Kit.

Apakah Pair to Mac bisa dipakai dengan Mac cloud?

+

Syarat dari Microsoft adalah Mac yang bisa dijangkau Windows, dengan Remote Login aktif. Kami belum menguji Pair to Mac lewat Tailscale. Build dengan dotnet di terminal Mac adalah jalur yang kami uji.

Bisakah saya build aplikasi iOS MAUI tanpa signing?

+

Bisa. Dalam test kami, dotnet build dengan -r ios-arm64 dan -p:EnableCodeSigning=false menghasilkan aplikasi perangkat tanpa sertifikat. Aplikasi itu tidak bisa dipasang atau diunggah sampai Anda menandatanganinya.

Panduan terkait