パブリックプレビューの .NET MAUI を M1 Mac で試してみた

## 背景と目的

現段階で、M1 Mac 環境での .NET6 MAUI の情報があまりなく、トライアンドエラーで試してみました。最低限必要なツールを揃えて MAUI アプリが動く事が確認できました。

## 前提条件

コマンドの実施環境は、Macbook Air (M1, 2020) です。

```bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.0.1
BuildVersion:   21A559
```

## M1 Mac 環境での .NET6 MAUI に最低限必要なツールを入れる

* .NET 6.0.100 SDK macOS Arm64 Installer

https://dotnet.microsoft.com/download/dotnet/6.0

* Android Studio Mac (64-bit, ARM) android-studio-2020.3.1.25-mac_arm.zip

https://developer.android.com/studio#downloads

* Xcode 13.1

```bash
$ xcodebuild -version
Xcode 13.1
Build version 13A1030d
```

なお、Visual Studio for Mac はインストールしていません。

## maui-check で MAUI 環境が揃ったか確認する

```bash
$ dotnet tool install -g redth.net.maui.check

$ export PATH="$PATH:~/.dotnet/tools"

$ maui-check
```

`Attempt to fix? [y/n] (y):` が表示されたら `y` で追加のSDKをダウンロードしてインストールしてくれます。

最終的には以下のような状態に持っていきました。

```bash
      _   _   _____   _____     __  __      _      _   _   ___                                                               
     | \ | | | ____| |_   _|   |  \/  |    / \    | | | | |_ _|                                                              
     |  \| | |  _|     | |     | |\/| |   / _ \   | | | |  | |                                                               
  _  | |\  | | |___    | |     | |  | |  / ___ \  | |_| |  | |                                                               
 (_) |_| \_| |_____|   |_|     |_|  |_| /_/   \_\  \___/  |___|                                                              
                                                                                                                             
🚑 .NET MAUI Check v0.10.0.0 💉
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
This tool will attempt to evaluate your .NET MAUI development environment.
If problems are detected, this tool may offer the option to try and fix them for you, or suggest a way to fix them yourself.

Thanks for choosing .NET MAUI!
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
⏳ Synchronizing configuration... ok
⏳ Scheduling appointments... ok

🔎 OpenJDK 11.0 Checkup...
  ✔ 11.0.12 (/Library/Java/JavaVirtualMachines/microsoft-11.jdk/Contents/Home/bin/..)

🔎 Visual Studio 8.10.0 Checkup...

🔎 Android SDK Checkup...
  ✔ emulator (30.9.4)
  ✔ build-tools;31.0.0 (31.0.0)
  ✔ platforms;android-31 (1)
  ✔ system-images;android-31;google_apis;x86_64 (8)
  ✔ platform-tools (31.0.3)
  ✔ cmdline-tools;5.0 (5.0)

🔎 Android Emulator Checkup...
  ✔ Emulator: Pixel_3a_API_31_arm64-v8a found.

🔎 XCode 13.1 Checkup...
  ✔ Xcode.app (13.1)

🔎 .NET SDK Checkup...
  ✔ 6.0.100 - /usr/local/share/dotnet/sdk/6.0.100

🔎 .NET SDK - Workload Deduplication Checkup...

🔎 .NET SDK - EnableWorkloadResolver.sentinel Checkup...

🔎 .NET SDK - Workloads (6.0.100) Checkup...
  ✔ android-aot (Microsoft.NET.Sdk.Android.Manifest-6.0.100 : 31.0.101-preview.10.59) installed.
  ✔ ios (Microsoft.NET.Sdk.iOS.Manifest-6.0.100 : 15.0.101-preview.10.251) installed.
  ✔ maccatalyst (Microsoft.NET.Sdk.MacCatalyst.Manifest-6.0.100 : 15.0.101-preview.10.251) installed.
  ✔ tvos (Microsoft.NET.Sdk.tvOS.Manifest-6.0.100 : 15.0.101-preview.10.251) installed.
  ✔ macos (Microsoft.NET.Sdk.macOS.Manifest-6.0.100 : 12.0.101-preview.10.251) installed.
  ✔ maui (Microsoft.NET.Sdk.Maui.Manifest-6.0.100 : 6.0.101-preview.10.2068) installed.
  ✔ wasm-tools (microsoft.net.workload.mono.toolchain.manifest-6.0.100 : 6.0.0) installed.
  ✔ microsoft-net-sdk-emscripten (microsoft.net.workload.emscripten.manifest-6.0.100 : 6.0.0) installed.
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

✔ Congratulations, everything looks great!

Press enter to exit...
```

## コマンドラインで .NET MAUI App を作る

```bash
$ dotnet new maui -n HelloMaui

$ cd HelloMaui

$ dotnet restore
```

## .NET MAUI App を Android で動かす

```bash
# エミュレーター名を取得します
$ ~/Library/Android/sdk/emulator/emulator -list-avds
Pixel_3a_API_31_arm64-v8a

# エミュレーターをビルド前に起動しておきます
$ ~/Library/Android/sdk/emulator/emulator \
  -avd Pixel_3a_API_31_arm64-v8a \
  -netdelay none \
  -netspeed full &

# ビルドします
$ dotnet build -t:Run -f net6.0-android
```

![maui_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/d86b4885-59db-76cc-4e24-91657d3391e7.png)

## .NET MAUI App を iOS で動かす

```bash
# とりあえずエミュレーターは何でも良いのでビルドしてみます
$ dotnet build -t:Run -f net6.0-ios

# 自分の Xcode 環境にある "13 Pro Max" の UDID を探します
$ /Applications/Xcode.app/Contents/Developer/usr/bin/simctl list | grep "13 Pro Max"
iPhone 13 Pro Max (com.apple.CoreSimulator.SimDeviceType.iPhone-13-Pro-Max)
    iPhone 13 Pro Max (81A6E8F2-839E-44CC-93D3-3BC3293DEE0A) (Shutdown) 
    Phone: iPhone 13 Pro Max (81A6E8F2-839E-44CC-93D3-3BC3293DEE0A) (Shutdown)

# UDID を指定してビルドします
$ dotnet build -t:Run -f net6.0-ios -p:_DeviceName=:v2:udid=81A6E8F2-839E-44CC-93D3-3BC3293DEE0A
```

![maui_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ab3e52ea-295e-e6a8-b782-e4da0de91ce4.png)

## .NET MAUI App を Mac で動かす

```bash
# ビルドします
$ dotnet build -t:Run -f net6.0-maccatalyst
```

![maui_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/9b4d010b-26fa-a914-395e-972341da5749.png)

## 参考

https://docs.microsoft.com/ja-jp/dotnet/maui/get-started/migrate