30
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

XamarinAdvent Calendar 2020

Day 12

我々は MAUI で Goodbye Xamarin できるのか?

Last updated at Posted at 2020-12-12

(この記事は多くの推測を含みます。意見交換 で投稿すると Advent Calendar とリンクできないので通常投稿します。)
Xamarin は .NET6 の一部となる ことが発表されて半年程度が経過しました。
既存の、あるいはこれからスクラッチする Xamarin 製アプリは .NET6 および MAUI リリースによる影響を把握しておく必要があります。
.NET6 のリリースは 2021年11月予定とのことですから、猶予はあと1年間ですね。
今年は .NET/Xamarin の情報をあまりキャッチアップできていないので、復習も兼ねて、 既存の Xamarin 製アプリを .NET6/MAUI にマイグレーションするために必要な具体的な作業は何か? について情報収集してみました。

MAUI発表当時に思っていたこと

MAUI が発表されたとき、「あー "Xamarin" という固有名詞は無くなって、ライブラリ名や namespace/class名 からも消えてゆくのだな」と考えていました。

私の予想構成図

image.png

私の予想コード

.NET5/Xamarin.Forms 現在

// X-plat
var button = new Xamarin.Forms.Button();
button.click += (s, e) => { /* clicked */ };

// Android specific
var nativeButton = new global::Android.Widget.Button();
nativeButton.click += (s, e) => { /* clicked */ };

.NET6/MAUI 以降

// X-plat
var button = new System.Maui.Button();
button.click += (s, e) => { /* clicked */ };

// Android specific
var nativeButton = new global::Android.Widget.Button();
nativeButton.click += (s, e) => { /* clicked */ };

ところが情報収集しているうちに「Xamarin という固有名詞はホントに(完全に)なくなるのか?」と疑念が生じてきました。

現状把握

2020年12月現在、公式に近い最新情報は David Ortinau 氏のこちらの発表動画(2020年10月にオンライン開催されたコミュニティイベント)かなと思いましたので、こちらを観て現在の予定を理解してみました。

動画で気になったところ

xamarin/android は dotnet/android になる?

image.png

まずはこちら。
Xamarin の integrate 先として

  • github.com/dotnet/maui
  • github.com/dotnet/android
  • github.com/dotnet/macios

が示されていますが、現在 /maui 以外のリポジトリはありません(公開されていません?)。
これは現在の github.com/xamarin/xamarin-android が、github.com/dotnet/android に移動することを示しているのでしょうか?

UI定義はあまり変わらなさそう

image.png

特に XAML は、もともと Xamarin 成分は少なかったので、ほぼそのまま使えそうな気がします。
コードでの定義も、namespace は分かりませんが実質のコードは変わらないのでしょう。

※MAUI では XAML の他に、MVU や ReactiveUI, Blazor も使用可になるとのことですが、ここではそれらは割愛します。

カスタムレンダラーの作り方は変わりそう

image.png

共通UI部品からそれぞれのネイティブUI部品にバインドするのは MAUI でも変わりませんが、その仕組みは Xamarin.Forms から変更があるようです。
Xamarin.Forms では Control と Renderer を実装していましたが、それに加え Handler と Mapper という概念が必要になるようです。

MAUI の位置づけがよく分からなくなってきた汗

image.png

image.png

「Xamarin.Forms から Renderer を分離して、さらに汎化させる」のような事を言っているのだと思いますが、MAUI の IButton の実装として、Xamarin.Forms があり、Comet(MVUでの実装と思われ) や ReactiveButton があり…、と「Xamarin.Forms すらもその上位から使用される立場」であることが示唆されています。

であるならば、Xamarin.Forms は「MAUI の選択肢のひとつ」として残る、つまり Uno Platform や Mobile Blazor Bindings と同レベルの概念として在り続ける、ということになります。

あれ? IButtonSystem.Maui.IButton になると考えると、Xamarin.Forms.Button は、どんな namespace+class になるのだろう?

「共通インターフェースとしての MAUI」と「実装の一つとしての MAUI」が存在するのでしょうか?。。。

ちなみに dotnet/maui の repo には、現状 Platform.Renderers/src/Xamarin.Forms.Platform.Android/Renderers/XXXRenderer という構成になっているので、このままリリースされたら、(公開APIかは置いといて) Xamarin という名称は残る事になります。

現行 Xamarin.Forms との互換性は保たれるっぽい…ということは?

image.png

image.png

  • 既存の CustomRenderer は書き換える必要があるか? → No
  • サードパーティ製の Xamarin.Forms 向けUI部品はそのまま使えるか? → Yes(ターゲット変更してビルドすれば)

との事なので、既存アプリの部品は MAUI でも動くようです。
ということは、.NET6 では Breaking Changes は無いのでしょうか?そんな事ないよね?何らかの Wrapper が用意されるのでしょうか?

その他の情報

Feature Roadmap · xamarin/Xamarin.Forms Wiki には、以下の記述があります。

Transition to .NET MAUI
July 15, 2020 Pull Request Policy Changes
As noted below, Xamarin.Forms 5.0 is due out at the end of September. At that time we will re-sync dotnet/maui and work on preparing our first preview release of .NET MAUI. In order to be considered for release by or before Xamarin.Forms 5.0, feature pull requests should be submitted for review by July 15.

After July 15, any new feature pull requests may still be submitted to this repository (xamarin/xamarin.forms). We will label those for migration to dotnet/maui. Be aware that the bulk of renderer refactoring will happen after Xamarin.Forms 5.0, so contributions to controls and renderers may require refactoring.

Pull requests to fix issues will continue to be reviewed through November 2022, and sync'd with dotnet/maui using a combination of automation and manual implementation.

Have an exception? These plans and dates are to help us make a smooth transition to release .NET MAUI with .NET 6 in November 2021. If you feel you have a need that should be an exception to this, shoot a message to Program Manager, David Ortinau. david.ortinau@microsoft.com.

意訳すると、

  • Xamarin.Form 5.0 がリリースされたら MAUI への移行に取りかかるよ
  • なので PR には dotnet/maui への移行用のラベルを付けるよ
  • 2022年11月まではこの repo でも PR を受け付けるよ

とのことなので、Xamarin.Form repo は MAUI のリリース時には dotnet/maui への最初の移行が完了していると思われます。
ちなみに現在 maui と名の付いたラベルやブランチは見つかりませんでした。

まとめ

いかがでしたか?
いろいろ調べてみましたが「既存の Xamarin 製アプリを .NET6/MAUI にマイグレーションするために必要な具体的な作業」はよく分かりませんでした。

で締めたら怒られそうですが、

  • リリースまで1年間も無いこと
  • MAUI とは Xamarin.Forms のさらに上位層なのか?ということ
  • 既存のカスタムレンダラーや 3rd party 製ライブラリは使えること

などを考えると、多くの Breaking Changes は無いのではないかなーと予想します。
とりあえず現状でできることは、「Xamarin に非依存なコードは別プロジェクトにして MAUI でも再利用可能にしておく」くらいでしょうかね。

30
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?