.Net6-preview3を使ってMAUIやってみた

## なぜ今のタイミング？

Microsoft .NET Newsのメールが届いたのを見て、（一つ前の記事のタイトルを見て）そういえば.Net6-preview3出てたなー、（[本文](https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-3/)読んで）MAUIのこと書いてないなー、とか思ってしまいまして。
せっかくだから試すか、と。

## MAUIって

というのは今更なので、そこはスルーで。

## Getting Started

やったことといえば、[ここ](https://github.com/dotnet/net6-mobile-samples)とか[ここ](https://github.com/dotnet/maui/wiki/Getting-Started)に書いてある通りのことをやったわけです。

## Install

### .Net6-preview

まずは[.NET6 preview](https://dotnet.microsoft.com/download/dotnet/6.0)をインストール。
2021/05/09の時点でpreview3です。

### mauiの環境

[上記](https://github.com/dotnet/net6-mobile-samples)に書いてある通り、maui-checkを動かします。

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

Windowsの場合、Git Bashだと`maui-check`が`Permission denied`とか言われたので、コマンドラインを管理者権限で起動して実行しなおしました。
macOSだと途中でパスワード聞かれるのでsudoしてるんでしょう。

OpenJDKやAndroid SDKやらXcodeやら.NET SDKやら必要ならダウンロードしてきて色々環境が整えられます。
yyとかって答えていればいいです。
最後に`Press enter to exit...`とか言われてEnterキー押下で終わりです。
楽です。

## project template

project templateがどうなっているか確認してみます。

```shell
$ dotnet new --list
```

増えてるのは以下のあたりですね。

```shell
Android Application                           android              [C#]        Android                        
Android Activity template                     android-activity     [C#]        Android                        
Android Java Library Binding                  android-bindinglib   [C#]        Android                        
Android Layout template                       android-layout       [C#]        Android                        
Android Class library                         androidlib           [C#]        Android                        
.NET Maui Mobile Application                  maui                 [C#]        Maui/Android/iOS/macOS/Catalyst
iOS Controller template                       ios-controller       [C#]        iOS                            
iOS Application                               ios                  [C#]        iOS                            
iOS Class library                             ioslib               [C#]        iOS                            
macOS Application                             macos                [C#]        macOS                          
MacCatalyst Application                       maccatalyst          [C#]        macOS/Catalyst                 
tvOS Application                              tvos                 [C#]        tvOS                           
```

macOSとMacCatalystで分かれてますね。
なんだろうと思ってみると、

```shell
Mac (Cocoa/AppKit)
Mac Catalyst (UIKit)
```

ということで、UIKitベースになっているようです。

## 作って動かしてみる

というわけで、実食。

### macOS

```shell
$ dotnet new macos -o Net6MacOS
```

出力されたコードを見ると、Xamarin.Macで出てくるものとほとんど変わりません。
storyboardも出てきます。
`AppDelegate`も`NSApplicationDelegate`ですね。

このままbuildしても色々ダメでした。
[Getting Started](https://github.com/dotnet/maui/wiki/Getting-Started)にしたがってnuget.configをルートに書き、ビルド。

```shell
$ cd Net6MacOS
$ cat<<END>nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
    <add key="xamarin" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
  </packageSources>
</configuration>
END
$ dotnet build -r osx-x64 -p:PublishTrimmed=false
```

すると、`./bin/Debug/net6.0-macos/osx-x64/`に`Net6MacOS.app`が出来上がっています。
実行するとウインドウが開きました。
Xamarin.Macで見知った画面左下に小さなウインドウが出てくるアレです。

### MacCatalyst

```shell
$ dotnet new maccatalyst -o Net6MacCatalyst
```

出力されたコードを見ると、`AppDelegate`内でウインドウを作っています。
こちらはstoryboard使わなそうですね。
同じようにnuget.configを置いてビルドします。

```shell
$ cd Net6MacOS
$ cat<<END>nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
    <add key="xamarin" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
  </packageSources>
</configuration>
END
$ dotnet build -r maccatalyst -p:PublishTrimmed=false
```

こちらは、`./bin/Debug/net6.0-maccatalyst/maccatalyst/`と`./bin/Debug/net6.0-maccatalyst/maccatalyst-x64/`に`Net6MacCatalyst.app`が出来上がっていました。
自分のはインテルMacなので、-x64の方だけ動かすことができました。
M1の方、試してみてください。

### iOS

さてiOSですが。

```shell
$ dotnet new ios -o Net6IOS
$ cd Net6IOS/
$ dotnet build -r ios -p:PublishTrimmed=false
```

このままだと`Could not find any available provisioning profiles for Net6IOS on iOS.`ということで、Bundle IDがないとダメですね。
[田淵さんの記事](https://blog.ytabuchi.dev/entry/2015/09/17/002321)（なつかしい…）のように、Xcodeで空プロジェクト作って仮のBundle IDを入手し、`Info.plist`を書き換えます。
あらためてビルドすると、ビルドは通ります。
こちらはnuget.config無くても大丈夫でした。

ただ、実行が。

```shell
$ dotnet build -t:Run -f net6.0-ios -p:PublishTrimmed=false
```

なんだか実機の方向いてしまってなんとも。
実機繋いでても認識してくれませんしね。
ターゲットを指定する方法が分かれば教えてください。

### Android

```shell
$ dotnet new android -o Net6Android
$ cd Net6Android
$ dotnet build -t:Run -f net6.0-android
```

なんのクセもなく、`adb devices`で認識しているデバイスで実行できました。
逆に拍子抜けです。

### MAUI

```shell
$ dotnet new maui -o Net6Maui
$ cd Net6Maui
$ cat<<END>nuget.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
    <add key="xamarin" value="https://pkgs.dev.azure.com/azure-public/vside/_packaging/xamarin-impl/nuget/v3/index.json" />
  </packageSources>
</configuration>
END
$ dotnet build -t:Run -f net6.0-maccatalyst
```

プロジェクトを作っただけだと、`App.xaml`できあがるわ、Android / iOS / MacCatalystの各ディレクトリ出来上がるわ、ディレクトリとターゲットの関連付けはわからんわで。

んでGetting Startedの通りにコマンド入れてみると、動くという。
こちらもあまり捻りがなく動くので、凝ったことをしなければ普通に動くのでしょう。

## 最後に

難しいことを考えずにサラリとやると動きましたので、Xamarinで培ってたものは大きいよね、という感じで。
あとは[このへん](https://devblogs.microsoft.com/dotnet/announcing-net-multi-platform-app-ui-preview-3/)とかみて実際にコードを書いてみるのがいいですね。

それにしても、dotnetコマンドからiOSやmacOSのプロジェクトが出来上がると、嬉しくなってきます。