19K Views
September 30, 22
スライド概要
SIerの人。Xamarin.iOS が好き。Azure と戯れるのが仕事。Visual Studio for Mac が Win版と同等になる日を切望。Microsoft MVP Developer Technologies 2017-
MAUI の現状と進化ポイント Tomohiro Suzuki @hiro128_777 2022-09-30 C# Tokyo
自己紹介 鈴木友宏 Microsoft 製品の技術支援の仕事をしています。 Twitter:@hiro128_777 blog:https://hiro128.hatenablog.jp/ 2
MAUI とは .NET Multi-platform App UI • C# と XAML を使用して、ネイティブのモバイル アプリやデスクトッ プ アプリを作成するためのクロスプラットフォーム フレームワーク • Xamarin.Formsの後継であり、1 つの共有コード ベースから Android、iOS、macOS、および Windows で実行できるアプリを 開発できる。 3
Xamarin and Xamarin.Forms のサポートはいつまで? • Xamarin のサポートは、2024 年 5 月 1 日にすべて終了します。 • Android 13 および iOS/iPadOS 16/macOS 13 が、Xamarin がサポートす る最終バージョンになります。 詳しくは以下を参照ください。 https://dotnet.microsoft.com/en-us/platform/support/policy/xamarin 4
Xamarin でできたことは、MAUIでもできるの? Xamarin でサポートされていたプロジェクトは .NET MAUI でサポートされているのでしょうか。 というわけで.NET MAUI の主なプロジェクトテンプレートを Xamarin と比較してみました。 Xamarin テンプレート名 .NET テンプレート名 短い名前 (dotnet new <TEMPLATE>) iOS アプリケーション(プレビュー) ios MacCatalyst アプリケーション(プレビュー) maccatalyst iOSアプリ iOSアプリ(Xamarin) watchOSアプリ watchOSアプリ(Xamarin) .NET 6 未サポート。.NET 7 での追加サポート予定もなし https://twitter.com/davidortinau/status/1519303524726849536 Androidアプリ Androidアプリ(Xamarin) Android Application android Android Wear アプリ Android Wear アプリ(Xamarin) Android Wear Application androidwear モバイルアプリ モバイルアプリ(Xamarin.Forms) .NET MAUI アプリ maui macOSアプリ cocoaアプリ(Xamarin) macOS アプリケーション(プレビュー) macOS MacCatalyst アプリケーション(プレビュー) maccatalyst 「短い名前」は、 .NET CLI で dotnet new maui i のように「短い名前」をテンプレート名として使うことでプロジェクトを作成できます。 5
watchOS アプリは未サポート .NET 7 での予定もなし .NET では watchOS アプリは未 サポートです。今のところ .NET 7 での追加サポート予定もありませ ん。 (たいして使われていない割に、 サポートするには手間がかかるた め、予定がないとのことです。) 右記、.NET MAUI のプロダクトマ ネージャーのツイートです。 6
MAUI が Xamarin.Foms と比べて便利になったところ 7
Xamarin.Forms と .NET MAUIの主な違い Xamarin.Forms プロジェクトの構造 .NET MAUI 非SDKスタイル(Franken-proj) SDK スタイル プラットフォームごとに個別のプロジェクトを使用 単一のプロジェクトで、複数プラットフォームを ターゲットにできる ツールチェーン .NET Framework .NET CLI リソース管理 プラットフォームごとに個別管理 単一のプロジェクト内で一元管理 ネイティブ UI コントロールのカスタマイズ プラットフォーム固有のデバイスの解像度に応じたイ SVGを1つだけ準備すれば、各プラットフォーム メージを準備しなければいけない の解像度のPNGに変換される ブートストラップ 独自(App クラス) .NET Generic Host ホットリロード 完全な XAMLホットリロード 完全な .NETホットリロード (SDK5.x および Visual Studio 2019 16.9以降) 完全な XAMLホットリロード UI コントロール アーキテクチャ レンダラー ハンドラー 8
SDK スタイルプロジェクト • インクルードするファイルのリストを保持する必要がなく、逆に除外するファイルのリストが保持 できる。ファイルはcsprojのフォルダーに置くだけで追加される。プロジェクトの参照とパッケージ の参照だけのみとなり、csprojファイルがシンプルになる。 • MS buildのターゲット ’restore’ を使って、NuGetのリストアを実行できる(MSBuild /t:restore) • csprojをアンロード、リロードすることなく、Visual Studio で直接編集し、リロードできる。 9
単一のプロジェクトで、複数プラットフォームをターゲットにできる 単一のプロジェクト。単一のマニフェストでアプリのタイトル、ID、バージョンを指定できる プラットフォーム SDK ワークロードとして.NET 6 に含まれる(ワークロードは明示的インストールが必要) プラットフォーム固有コード ここ以外の共通コード内でも、プラットフォーム固有の API にアクセスできる リソースの一元管理 たとえば、Image は SVG を1つだけ準備すれば、各プラットフォームの解像度のPNGに変換される クロスプラットフォームのアプリのエントリーポイント(Generic Host 対応) 10
Xamarin.Forms のレンダラーアーキテクチャー 共有コード プラットフォーム固有コード Xamarin.Forms.Platform.iOS Xamarin.Forms LabelRenderer Label Xamarin.Forms.Platform.Android LabelRenderer レンダラーは、共有プロジェクトの UI コントロール実装に依存している 11
Xamarin.Forms のレンダラーアーキテクチャーの問題点 • レンダラーが Xamarin.Forms の UI コンポーネントと密結合している。 • アセンブリスキャンとリフレクションというコストの大きい処理を使用して UI コントロールのレンダ ラーを取得するため遅い。 • 共有プロジェクトからネイティブ UI コントロールにアクセスする場合、レンダラーを介してアクセス する手段は一応あるが、手間がかかり使い勝手が悪い。 • 共有プロジェクトからネイティブ UI コントロールのプロパティを変更する場合、たった1つのプロパ ティの変更であっても、共有プロジェクトとネイティブプロジェクトにまたがるレンダリングの仕組 みを理解した上で、レンダラーに対し定型的な多くのコードを記述する必要があり、使い勝手 が悪い。 12
.NET MAUI のハンドラーアーキテクチャー 共有コード 抽象化UIコントロール インターフェース プラットフォーム固有コード Partial Class Microsoft.Maui.Controls Microsoft.Maui Microsoft.Maui.Handlers Label ILabel LabelHandler LabelHandler.cs LabelHandler.iOS.cs LabelHandler.Android.cs Microsoft.Maui.Controls Microsoft.Maui Microsoft.Maui.Handlers ハンドラーはインターフェースにのみ依存し、共有プロジェクトの抽象化 UI コントロールの実装には依存し ない。 共有プロジェクトでも、プラットフォーム固有プロジェクトでも、ネイティブ UI コントロールを直接操作できる 13
.NET MAUI で導入されたハンドラーアーキテクチャー Xamarin.Forms におけるレンダラーの役割は、.NET MAUI のハンドラーに引き継がれました。 最大のコンセプトの違いは、ハンドラによって処理されるプラットフォーム固有のレンダリングの責 務を、共有コードの抽象化 UI フレームワークの実装から分離したことです。 これによって以下のようなメリットが生まれました。 • ハンドラーはアセンブリスキャンが不要➡︎速度向上 • 共有コード内でもでもネイティブ UI コントロールに直接アクセスしてプロパティを変更できる。 • ハンドラーは、.NET MAUI の .NET Generic Host 内に直接記述も可能で、簡単に実装およ び使用でき、特定のコントロール、またはアプリで使用されるすべてのコントロールに簡単に追 加できる。 1
(参考).NET Generic Host 単一のクロスプラットフォームアプリエントリポイント(MauiProgram.cs)でアプリのグローバル構 成を管理するデザインパターンであり、シンプルで保守も簡単です。 プラットフォームフォルダには、各プラットフォームでアプリを起動するプラットフォーム固有のコードが 含まれています。 なお、Blazor アプリや ASP.NET Coreアプリでも同様のパターンが提供されています。 ビルダーでは以下の内容を構成できます。 • 起動するアプリクラスの指定 • フォント登録 • Dependency injection • ネイティブ UI コントロールのカスタマイズ 1
.NET MAUI のブートストラップ サンプルコード MauiProgram.cs 16
起動するアプリクラスの指定 MauiProgram.cs App.xaml.cs 17
フォントの登録 MauiProgram.cs 18
Dependency injection : AppSlell クラスを DI コンテナに登録 MauiProgram.cs App.xaml.cs 19
ネイティブ UI コントロールのカスタマイズ MauiProgram.cs レンダリング結果 共有プロジェクトでも、ネイティブ UI コントロールを直接操作できる 20
Visual Studio 2022 の対応・動作状況 2022/09/30現在 Windows x64 環境のみ動作する状況 Visual Studio for Mac はバージョンアップすると逆に動かなくなったりと非常に不安定 iOS アプリ が Windows からのリモート接続で動作するので SDK 側は安定しており、単に VS4M がダメダメな状況 (VS4M 2019 : Xamarin.Mac(GTK# + AppKit)→ VS4M 2022 : .NET6(AppKit)で再実装している) Windows x64 Android アプリ 対応 iOS アプリ Visual Studio 2022 17.3.5 Xcode 13.3 で動作 MacCatalyst アプリ Mac アプリ 非対応 (なのにプロジェクトが作れる笑) MAUI アプリ Android は問題なし iOS は Visual Studio 2022 17.3.5 Xcode 13.3 で動作 Windows ARM64 ネイティブ UI コントロールのカスタマイズ ワークロード自体が まだ未対応 Mac ARM64 Stable: 未対応2022後半にサポート予 定 Preview: 現状 Buggy すぎてまともに動か ない… 21
そもそも Microsoft 側のリソース少なすぎ問題 Visual Studio for Mac と MAUI tool で開発者7人!!…それは厳しすぎます… Microsoft さん、もっと雇って!! 中の人のツイート⇨ ネイティブ UI コントロールのカスタマイズ 22
iOS の手動プロビジョニングが失敗する時 Xcode で同名の Bundle Identifier で空アプリを作成し、一度デプロイした後に Visual Studio で実行すると解決 します。 (Xamarin 時代からお馴染みの Tips) (自動プロビジョニングもありますが、Apple Developer Program への加入が必要です) ネイティブ UI コントロールのカスタマイズ Visual Studio Xcode 23
みなさまへのお願い Microsoft に MAUI にもっと開発リソースを割いてもらうためには 24
MAUI がもっと進化するためには https://developercommunity.visualstudio.com/ にフィードバックして直接圧力アピール!! インストール、プロジェクト作成、ビルドを実行してテレメトリーを飛ばす! 25
ご清聴ありがとうございました