第 9 章の概要: プラットフォーム固有の API 呼び出し
Note
この本は 2016 年春に発行されて以降、改訂されていません。 多くの情報はまだ価値がありますが、一部の資料は古くなっており、トピックの中にはまったく正しくないものまたは不完全なものもあります。
プラットフォームによって異なるコードを実行することが必要になる場合があります。 この章では、その手法について説明します。
共有アセット プロジェクトでの前処理
Xamarin.Forms の共有アセット プロジェクトでは、C# のプリプロセッサ ディレクティブ #if
、#elif
と endif
を使用して、プラットフォームごとに異なるコードを実行できます。 これについては、PlatInfoSap1 で示されています
ただし、結果として得られるコードは、乱雑で読みにくくなる可能性があります。
共有アセット プロジェクトでの並列クラス
SAP でプラットフォーム固有のコードを実行するためのより構造化されたアプローチについては、PlatInfoSap2 サンプルで示されています。 各プラットフォーム プロジェクトには、名前は同じですが、実装はそのプラットフォームに固有である、クラスとメソッドが含まれています。 SAP では、単純にクラスがインスタンス化されて、メソッドが呼び出されます。
DependencyService とポータブル クラス ライブラリ
Note
ポータブル クラス ライブラリは、.NET Standard ライブラリに置き換えられています。 本のすべてのサンプル コードは、.NET Standard ライブラリを使用するように変換されています。
通常、ライブラリでアプリケーション プロジェクト内のクラスにアクセスすることはできません。 この制限により、PlatInfoSap2 で示されている手法はライブラリでは使用できないように見えます。 しかし、Xamarin.Forms に含まれる DependencyService
という名前のクラスは、.NET リフレクションを使用して、ライブラリからアプリケーション プロジェクトのパブリック クラスにアクセスします。
ライブラリでは、各プラットフォームで使用する必要があるメンバーを含む interface
を定義する必要があります。 その場合、各プラットフォームには、そのインターフェイスの実装が含まれます。 インターフェイスを実装するクラスは、アセンブリ レベルで DependencyAttribute により示される必要があります。
その後、ライブラリでは、DependencyService
のジェネリック Get
メソッドを使用して、インターフェイスを実装するプラットフォーム クラスのインスタンスを取得します。
これは、DisplayPlatformInfo サンプルで示されています。
プラットフォーム固有のサウンド生成
MonkeyTapWithSound サンプルでは、各プラットフォームのサウンド生成機能にアクセスすることによって、MonkeyTap プログラムにビープ音を追加しています。