Uno Platform 入門 1 : Uno Platform とは？ ～ C# で iOS, Android, Web, Windows 10 アプリを一気にクロスプラットフォーム開発～

C# で iOS, Android, Web, Windows 10 (UWP) アプリを一気に **クロスプラットフォーム開発** できる、(UWP 向けのコードが他 3 プラットフォーム向けにビルドできるようになる) 、
**アプリケーション開発フレームワーク** である **Uno Platform** (ウノ プラットフォーム) を
触ってみたのでここに記録します。

次の記事 『[Uno Platform 入門 2 : 環境構築をしよう！ Uno Platform ハローワールド](https://qiita.com/chomado/items/0dc020f10eb738cad7cd)』


## Uno Platform とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/a67e097f-12af-1100-92dc-12b28f646822.png)

[https://platform.uno/]

**Uno Platform** とは、
オープンソースで開発されている、
クロスプラットフォーム開発ライブラリです。

[公式ドキュメント](https://platform.uno/docs/articles/intro.html)を読んでみましょう。


> The Uno Platform is a Universal Windows Platform Bridge that allows UWP-based code (C# and XAML) to run on iOS, Android, and WebAssembly.

> (Uno Platform とは、UWP ベースのコード (C# + XAML) を iOS, Android, WebAssembly で動くようにする Universal Windows Platform Bridge です。)


要するに、
**Uno Platform** を使えば、C# + XAML だけで


0. Windows 10 アプリ (UWP)
1. iOS アプリ
2. Android アプリ
3. Web アプリ（WebAssembly）

が
一気に!
効率良く!
クロスプラットフォーム開発 (= 複数プラットフォーム間でソースコードを共通化しながら開発)!
できるというものです。

しかもオレオレ仕様ではなく、UWP ベースのコードが動くのが素晴らしいですね。(UWP 向けのコードが他プラットフォーム向けにビルドできるようになる)

こちらの、元 Microsoft MVP の biac さんの記事が詳しいのでご覧になってください。
→ [UWPアプリを書けばiOS／Android／Webでも動く! Uno Platform：クロスプラットフォーム開発環境](https://codezine.jp/article/detail/11795)

## XAML とは

『**XAML**』(ザムル)：

* Extensible Application Markup Language の略
* アプリ UI などを定義する用の XML ベースのマークアップ言語
* UI を XAML で書いて、<br />その裏の処理 (ボタンを押された時の処理など) を C# でプログラム、<br />という流れになる

### XAML 例

ボタンを表示させる XAML 例

````xml
<Button Background="Blue" Foreground="Red" Content="これはボタンです"/>
````

## UWP とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/f4b729ae-6a08-e07d-d7f0-553c0862e234.png)


**UWP** (ユーダブリューピー) とは、
**Universal Windows Platform** のことで、
Windows 10 のコアです。

簡単に言うと
「**UWP アプリ**」と言われたら
「ストアで配布可能な、 **Windows 10 で動くアプリ**」
と思えば大体合ってます。

詳しく知りたい方はこちらの公式ドキュメントをどうぞ：
[ユニバーサル Windows プラットフォーム (UWP) アプリとは - Microsoft 公式ドキュメント](https://docs.microsoft.com/ja-jp/windows/uwp/get-started/universal-application-platform-guide?WT.mc_id=docs-blog-machiy)

## Xamarin.Forms と Uno Platform

(* ゜▽゜ * っ)З「良いね！　でも、あれ？ C# + XAML でクロスプラットフォーム開発って、**Xamarin**  (ザマリン) もそうじゃなかったっけ？」


たしかに、 **Xamarin.Forms** でも、
C# + XAML で
iOS, Android, UWP アプリが
クロスプラットフォーム開発できます。

でも Xamarin.Forms では Web アプリ開発はできません。

また、Xamarin.Forms の XAML 記法は UWP とかの記法と違う記法だけど、
Uno Platform は UWP や WPF と同じように書けます。

* [Xamarin とは - Microsoft 公式ドキュメント](https://docs.microsoft.com/ja-jp/xamarin/get-started/what-is-xamarin?WT.mc_id=docs-blog-machiy)
* [Xamarin.Forms ドキュメント - Microsoft 公式ドキュメント](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/?WT.mc_id=docs-blog-machiy)

一方、

Xamarin.Forms は Microsoft 公式が開発してるフレームワークで、とくに 2016 年の MS による Xamarin 買収以降、一気に物凄くしっかりしてきました。現在も多くの企業の大手アプリでの採用事例が広がっていっています。

また、Uno Platform は Xamarin を使って動いてる (後述) のですが、Xamarin.Forms は Xamarin 自身からリリースされてますし、そこも良さがあります。

> Xamarin.Forms は各コンポーネントはプラットフォームネイティブの UI コンポーネントで構成されるので、単一コードで各プラットフォームに沿った UI をクラスプラットフォームで構築しやすいというメリットがありますが、反面設定できる項目が少なくカスタマイズ性が低いということになります。

> これは **どちらが優れているかという事ではなく、フレームワークの性質ということだと思うので、ケースによって判断すればよい** と思います。

> (ちなみに Uno Platform は Native Style を指定する事でプラットフォームネイティブのコンポーネントを同一画面内で混在させて使用する事が可能となっています)

(引用：[Uno Platform のススメ](https://qiita.com/tan-y/items/b240252870a4d7aa9d34) より)

### 比較表

.|Xamarin.Forms|Uno Platform|
----|----|----
読み方|ザマリン フォームズ|ウノ プラットフォーム
ロゴ|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/680b6ab7-e6da-a7ab-cb2d-f7e0d09916d7.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/a53fa480-00d4-760a-f8ef-1551468a1aa8.png)
開発元|Microsoft 社|nventive 社
誕生年|2014 年|2018 年
OSS？|[オープンソース](https://github.com/xamarin/Xamarin.Forms)|[オープンソース](https://github.com/unoplatform)
開発言語|C# (+ XAML), F# (+ XAML)|C# + XAML
XAML記法|UWP, WPF とは異なる|UWP, WPF と同じ
開発可能プラットフォーム <br />(preview 版を除く)|iOS, <br />Android, <br />UWP (Windows 10)|iOS, <br />Android, <br />UWP (Windows 10), <br />WebAssembly (Web アプリ)

（Xamarin.Forms は preview 版なら [macOS](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/platform/other/mac?WT.mc_id=docs-blog-machiy) や [WPF](https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/platform/other/wpf?WT.mc_id=docs-blog-machiy) なども対応しています）

## Uno Platform の仕組み：Uno Platform は Xamarin の上で動いている

(* ゜▽゜ * っ)З「**Uno Platform** は **Xamarin** とは関係ないの？」

あります！！

**Uno Platform** は **Xamarin** の上で動いています！
(Microsoft 入社前は Xamarin でスマホアプリ開発していたプログラマーだったので、個人的にこれが一番熱い)

(* ゜▽゜ * っ)З「まあそうだよね、すでに **C# が iOS, Android など向けにビルドできるようになる環境** [(**Xamarin**) がオープンソースで開発されてる](https://github.com/xamarin)のに、それを使わないで独自にそこからイチから作るのは理にかなってないよね。既にあるものを利用するべきだよね」

![Uno Platform](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/1d37e040-c7ed-f14a-3635-2f0a07060e1b.png)

(上のアーキテクト図は[ 公式サイト ](https://platform.uno/how-it-works/)より)

上の図を見ると、例えば、

一番左の UWP の欄、
我々の書くコードはもともと UWP のものなので、
UWP はそのまま UWP アプリ (Windows 10 アプリ) としてビルドされます。

そして iOS, Android アプリは、
我々プログラマーの書くコード (C#+XAML) の下に Uno Platform がいて、
その Uno Platform は Xamarin を使っていて、
その Xamarin は mono を使って動いています。

(**mono** は .NET 系 (C#) のランタイムのひとつ。これも[オープンソース](https://github.com/mono/mono)。mono があるから iOS, Android の上でも C# が動くよ。ちなみにゲームエンジンで有名な Unity も mono を使ってるよ)

そして Xamarin は WebAssembly をサポートしていないので、Uno Platform は mono を直接たたいて動いています。


## 次回記事

次の記事では環境構築について書きました！

→ 『[Uno Platform 入門 2 : 環境構築をしよう！ Uno Platform ハローワールド](https://qiita.com/chomado/items/0dc020f10eb738cad7cd)』

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/60fb50c9-b60b-e15f-2f93-bd35d5fad97c.png)