Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin と Xamarin.Forms と iOS/Android をつなぐ技術を一気に紹介

こんにちは。エクセルソフトの田淵です。

これは [初心者さん・学生さん大歓迎!] Xamarin その1 Advent Calendar 2017 - Qiita の 20日目のエントリーです。

確かに!w

Xamarin には色々な技術があり、それぞれに非常に紛らわしい名前が付いています。本エントリーではそれらをさっと解説していきます。あ、これはそういう技術なのかーと思っていただければ幸いです。

2017/12/20 現在の情報です。Preview が Stable になった場合は記事を修正予定です。

基本

Xamarin ネイティブ(本家ではあまり使われないのでカタカナで書きました)

Xamarin.iOS/Xamarin.Android を使用した開発手法。Xamarin Traditional や Xamarin Platform と書かれることもあるかもしれません。UI は個別(iOS は Storyboard、Androidxml)で作成し、共通化できるのはロジックの部分のみです。

Xamarin.Forms

iOSAndroid/UWP に対応した UI を WPF などの開発で使う XAML または C# で共通コードで書ける UI フレームワークです。現在 macOSWPF、Tizen などのプラットフォームにも対応が予定されています。簡単なアプリであれば素早く開発できるのが利点です。

iOSAndroid ネイティブ

余談ですが、Xamarin 開発者の間では iOSAndroid ネイティブと言えば、Swift/Objective-C、Kotlin/Java のことですよね。iOSAndroid ネイティブ開発者の方々の間では、ネイティブというと C/C++ で記述することかもしれないです。「ネイティブ」という言葉は闇が深い…!

Xamarin.Forms と Xamarin ネイティブを繋ぐ技術

Xamarin.Forms Embedding

公式ブログ:Unleashed: Embedding Xamarin.Forms in Xamarin Native | Xamarin Blog

Xamarin.Forms のページを Xamarin ネイティブから呼び出す機能です。Xamarin.Forms v3.0 で実装予定で現在は Preview 提供です。

Native Embedding

公式ドキュメント:Native Embedding - Xamarin

@ticktackmobile さんの解説エントリー:【Xamarin.Forms 2.2】Embedded Platform-Specific Controls in Xamarin.Forms - ぴーさんログ

Shared プロジェクトの C# コードで iOSAndroid/UWP のネイティブコントロールを埋め込む機能です。#if __IOS__ などのディレクティブを使用して Xamarin.Forms の StackLayoutiOSUILabel を追加したりできます。

Native View

公式ドキュメント:Native Views - Xamarin

Shared プロジェクトの XAMLC# を使用して iOSAndroid/UWP のネイティブコントロールを埋め込む機能です。Native Embedding と概ね同じことをやっていると思われます。Data Binding などもできるのみたいで、よりややこしい印象です。

Shared プロジェクト限定で、かつ、XAMLC(公式ドキュメント:XAML Compilation - Xamarin)は使えないので注意してください。

ここまでのまとめ

Xamarin.Forms で Xamarin ネイティブのコントロールAPI を使う方法はたくさんあります。垣根は無くなっていくので、今後は Forms とネイティブどっちを使えば良いの?という議論がなくなるかもしれませんね。

その他の以前からある Xamarin ネイティブのコントロールAPI を使う方法、

  • OnPlatform
  • DependecyService
  • Custom Renderer
  • Effects

については以下をご覧ください。

Xamarin.Formsでプラットフォーム固有実装を扱う手段が増えてきたので整理してみる - ぴーさんログ

OnPlatform については Xamarin.Forms 2.3.5(かな?)で仕様が変わったので、以下をご覧ください。

【Xamarin.Forms 2.3.4-pre】新しいOnPlatformメカニズム - ぴーさんログ

また、各プラットフォーム固有の API を PCL/.NET Standard/Shared プロジェクトから共通コードで使えるようにライブラリ化したのが Plugin(または Component)です。どんなのがあるか?は以下をご覧ください。

xamarin/XamarinComponents: Plugins for Xamarin

Xamarin と iOSAndroid ネイティブを繋ぐ技術

Native Binding

公式ドキュメント:

Android のライブラリ(JAR や AAR)や iOSmacOS の Framework を Xamarin で使えるように C# でラップする機能です。

かなり辛い。と聞いています。

@iseebi さんが一番情報を公開してくださっているので、エントリーを貼っておきます。

id:mattsuDev さんのエントリーも。

Native Reference

公式ドキュメント:Native References - Xamarin

Xcode で作成した Embedded Framework を Xamarin.iOS で使用する機能です。日本語版の Visual Studio だと「ネイティブ参照」です。

f:id:ytabuchi:20171220171641p:plain:w450

f:id:ytabuchi:20171220171647p:plain:w450

(すみません。使ったことが無いので実態がよく分かっていません…!)

Native ライブラリのリンク

公式ドキュメント:

C、C++ で記述された .so.a を呼び出す機能です。

.NET Embedding

公式ドキュメント:

@atsushieno さんの解説スライド:Embeddinator-4000から学ぶXamarinの基礎 // Speaker Deck

Xamarin で作成したコードを iOSAndroid ネイティブ(Swift/Objective-C、Kotlin/Java)から使用できるようにする機能です。コードネームは Embeddinator-4000 でした。

まとめ

色々な技術がどの部分の橋渡しをするのか?について、@amay077 さんが図で纏めてくださったので、許可を頂いてここに掲載します。ありがとうございます!!

f:id:ytabuchi:20171222134347p:plain:w900

Xamarin は Xamarin.Forms と Xamarin ネイティブも相互に使いまわしが出来るし、iOSAndroid ネイティブのライブラリなども使える!最強じゃね!!!?と思うのですが、その道は茨の道でもあるようです。

ただ、すべて C# で書ける。というのに違いはないですし、大変だとしても「その手段がある」ことが素晴らしいと思います。

特に Xamarin.Forms しかやっていない方はこれを機に Xamarin ネイティブにも手を伸ばしてみてはいかがでしょうか?

以上です。

明日は gnk263 さんです!よろしくお願いいたします。

エクセルソフト | ダウンロード | 学習用リソース | JXUG リンクページ | ブログ購読