こんにちは。エクセルソフトの田淵です。
これは [初心者さん・学生さん大歓迎!] Xamarin その1 Advent Calendar 2017 - Qiita の 20日目のエントリーです。
というかXamarin.Forms Embeddingと(仮で)呼ばれてた機能が結局Xamarin.Forms Native Formsになったのな。NaitiveやEmbedが氾濫しすぎじゃないですか。
— ざまりん.ふぉーむずマン🚲 (@ticktackmobile) 2017年11月16日
確かに!w
Xamarin には色々な技術があり、それぞれに非常に紛らわしい名前が付いています。本エントリーではそれらをさっと解説していきます。あ、これはそういう技術なのかーと思っていただければ幸いです。
2017/12/20 現在の情報です。Preview が Stable になった場合は記事を修正予定です。
基本
Xamarin ネイティブ(本家ではあまり使われないのでカタカナで書きました)
Xamarin.iOS/Xamarin.Android を使用した開発手法。Xamarin Traditional や Xamarin Platform と書かれることもあるかもしれません。UI は個別(iOS は Storyboard、Android は xml)で作成し、共通化できるのはロジックの部分のみです。
Xamarin.Forms
iOS/Android/UWP に対応した UI を WPF などの開発で使う XAML または C# で共通コードで書ける UI フレームワークです。現在 macOS、WPF、Tizen などのプラットフォームにも対応が予定されています。簡単なアプリであれば素早く開発できるのが利点です。
iOS/Android ネイティブ
余談ですが、Xamarin 開発者の間では iOS/Android ネイティブと言えば、Swift/Objective-C、Kotlin/Java のことですよね。iOS/Android ネイティブ開発者の方々の間では、ネイティブというと 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# コードで iOS/Android/UWP のネイティブコントロールを埋め込む機能です。#if __IOS__
などのディレクティブを使用して Xamarin.Forms の StackLayout
に iOS の UILabel
を追加したりできます。
Native View
公式ドキュメント:Native Views - Xamarin
Shared プロジェクトの XAML と C# を使用して iOS/Android/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 と iOS/Android ネイティブを繋ぐ技術
Native Binding
公式ドキュメント:
- Binding iOS Libraries - Xamarin (iOS)
- Binding a Java Library - Xamarin (Android)
- Binding Objective-C - Xamarin (iOS and macOS)
- Binding Mac Libraries - Xamarin (macOS)
Android のライブラリ(JAR や AAR)や iOS/macOS の Framework を Xamarin で使えるように C# でラップする機能です。
かなり辛い。と聞いています。
@iseebi さんが一番情報を公開してくださっているので、エントリーを貼っておきます。
- Xamarin.iOS でバインディングライブラリを作る - Qiita
- Xamarin.iOS のネイティブバインディングを活用して既存の Objective-C 資産を流用する - Qiita
- Xamarin.Android で Java Integration ライブラリを作る - Qiita
- 新しくなったObjective SharpieでCocoaPodsのバインディングライブラリを作る - Qiita
- Xamarin.iOS の Swift バインディングライブラリを作る - Qiita
id:mattsuDev さんのエントリーも。
- XamarinでNativeライブラリを使用する (iOS編) - mattsuDev’s blog
- XamarinでNativeライブラリを使用する(Android編) - mattsuDev’s blog
Native Reference
公式ドキュメント:Native References - Xamarin
Xcode で作成した Embedded Framework を Xamarin.iOS で使用する機能です。日本語版の Visual Studio だと「ネイティブ参照」です。
(すみません。使ったことが無いので実態がよく分かっていません…!)
Native ライブラリのリンク
公式ドキュメント:
C、C++ で記述された .so
や .a
を呼び出す機能です。
.NET Embedding
公式ドキュメント:
@atsushieno さんの解説スライド:Embeddinator-4000から学ぶXamarinの基礎 // Speaker Deck
Xamarin で作成したコードを iOS/Android ネイティブ(Swift/Objective-C、Kotlin/Java)から使用できるようにする機能です。コードネームは Embeddinator-4000 でした。
まとめ
色々な技術がどの部分の橋渡しをするのか?について、@amay077 さんが図で纏めてくださったので、許可を頂いてここに掲載します。ありがとうございます!!
Xamarin は Xamarin.Forms と Xamarin ネイティブも相互に使いまわしが出来るし、iOS/Android ネイティブのライブラリなども使える!最強じゃね!!!?と思うのですが、その道は茨の道でもあるようです。
ただ、すべて C# で書ける。というのに違いはないですし、大変だとしても「その手段がある」ことが素晴らしいと思います。
特に Xamarin.Forms しかやっていない方はこれを機に Xamarin ネイティブにも手を伸ばしてみてはいかがでしょうか?
以上です。
明日は gnk263 さんです!よろしくお願いいたします。