Xamarinを使ったクロスプラットフォーム開発のお勉強第1歩として、こちらのページにある入門用チュートリアルをやってみています。
Xamarin.Forms Quickstart
Xamarin.Formsを使ったアプリの取っ掛かりとして、良い題材ですね。これを使ったクロスプラットフォーム開発がどんなものなのかが何となく分かるものになっています。
##1.このチュートリアルでできるアプリ
これはアメリカで見かける、アルファベットで表記された電話番号を通常の電話番号に変換して電話を掛けるアプリです(参考:アメリカの電話番号のアルファベット表記)
作ってみると、下図のような動きをするアプリが出来上がります。
##2.このプログラムの構造
実際このチュートリアル通りにプログラムを作ってみると分かるんですが、下図のような構造になっているんですね。
UIやビジネスロジックは各OS共通で書けるようですが、デバイスの操作をする部分(このチュートリアルでは電話をかける部分)は、個別にロジックを作る必要があるようです。
なので、恐らくですが、例えばGPS情報の取得のようなものは、個別に書く必要がありそうですね。
で、この共通部分と各OS個別に書く部分のデータの受け渡しを、
(1) インターフェース
(2) DependencyService.Get();
(3) [assembly: Dependency(typeof(<クラス名>))]
の3つを使って実現しています。
各OS毎のプログラムを組む部分を、このチュートリアルでは
・「IDialer」インターフェースを用意
・それを各OS毎に「PhoneDialer」クラスとして実装
という方法を採っています。通常のオブジェクト指向の実装方法ですね。
この実装したクラスのインスタンスを取得するのに、「DependencyService.Get();」と「[assembly: Dependency(typeof(<クラス名>))]」を使っています。
このインスタンスの取得をしている部分が下図の部分です。ここにブレークポイントを置いてみると、今現在実行している端末のインスタンスが取得できていることが分かります。
「DependencyService.Get();」というプログラムでインスタンスが取得できることが分かります。
ここで、試しに各OS毎に書いたプログラム(PhoneDialer.cs)にある「[assembly: Dependency(typeof(PhoneDialer))]」をコメントアウトして、もう一度デバッグ実行してみます。
すると、図中に示したように、インスタンスの取得ができず、nullとなってしまいます。「[assembly: Dependency(typeof(<クラス名>))]」がないとダメなようですね。
まだ取っ掛かり程度の知識しかありませんが、Xamarin.Formsで開発する場合、
(1) UI、ビジネスロジックはロジックを共通化できる
(2) デバイスを直接使う部分は個別にロジックを書く必要がある
ということでしょうか?
デバイスの機能を使う部分とはいえ、例えばHTTP通信とか電波が圏外になっているかどうかなども個別にロジックが必要なのか、まだまだ調べなきゃいけないことはありますね。