構成管理
Note
この電子ブックは 2017 年春に発行されたもので、その後は改訂されていません。 このブックには今なお価値のある内容が多く含まれていますが、一部の記載内容は古くなっています。
設定を使用すると、アプリの動作を構成するデータをコードから分離できるため、アプリを再構築せずに動作を変更できます。 アプリ設定とユーザー設定という、2 種類の設定があります。
アプリ設定は、アプリが作成および管理するデータです。 これには、固定 Web サービス エンドポイント、API キー、ランタイム状態などのデータを含めることができます。 アプリ設定はアプリの存在に関連付けられ、そのアプリにとってのみ意味があります。
ユーザー設定は、アプリの動作に影響を与え、頻繁に再調整する必要がないアプリのカスタマイズ可能な設定です。 たとえば、アプリではデータを取得する場所と画面に表示する方法をユーザーが指定できる場合があります。
Xamarin.Forms には、設定データの格納に使用できる永続的な辞書が含まれています。 この辞書には Application.Current.Properties
プロパティを使用してアクセスできます。配置されたすべてのデータは、アプリがスリープ状態になったときに保存され、アプリが再開または再起動されたときに復元されます。 さらに、Application
クラスには、アプリが必要に応じて設定を保存できるようにする SavePropertiesAsync
メソッドもあります。 この辞書の詳細については、「Properties ディクショナリ」を参照してください。
Xamarin.Forms 永続ディクショナリを使用してデータを格納する際の欠点は、データがバインドされにくいということです。 したがって、eShopOnContainers モバイル アプリでは Xam.Plugins.Settings ライブラリが使用されます (NuGet から入手できます)。 このライブラリでは、各プラットフォームで提供されるネイティブ設定管理を使用しながら、アプリとユーザーの設定を永続化および取得するための、一貫したタイプ セーフなクロスプラットフォーム アプローチが提供されます。 さらに、データ バインディングを使用して、ライブラリによって公開される設定データに簡単にアクセスできます。
Note
Xam.Plugin.Settings ライブラリはアプリとユーザーの両方の設定を格納できますが、この 2 つは区別されません。
Settings クラスの作成
Xam.Plugins.Settings ライブラリを使用する場合、アプリに必要なアプリとユーザーの設定が含まれる 1 つの静的クラスを作成する必要があります。 次のコード例は、eShopOnContainers モバイル アプリの Settings クラスを示しています。
public static class Settings
{
private static ISettings AppSettings
{
get
{
return CrossSettings.Current;
}
}
...
}
設定は、Xam.Plugins.Settings ライブラリによって提供される ISettings
API を使用して読み書きできます。 このライブラリには、API CrossSettings.Current
へのアクセスに使用できるシングルトンが用意されており、アプリの設定クラスは ISettings
プロパティを介してこのシングルトンを公開する 必要があります。
Note
Plugin.Settings と Plugin.Settings.Abstractions の名前空間のディレクティブの使用を、Xam.Plugins.Settings ライブラリ タイプへのアクセスを必要とするクラスに追加する必要があります。
設定の追加
各設定は、キー、既定値、およびプロパティで構成されます。 次のコード例は、eShopOnContainers モバイル アプリが接続するオンライン サービスのベース URL を表すユーザー設定の 3 つの項目すべてを示しています。
public static class Settings
{
...
private const string IdUrlBase = "url_base";
private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;
...
public static string UrlBase
{
get
{
return AppSettings.GetValueOrDefault<string>(IdUrlBase, UrlBaseDefault);
}
set
{
AppSettings.AddOrUpdateValue<string>(IdUrlBase, value);
}
}
}
キーはキー名を定義する const 文字列であり、設定の既定値は、必須の型の静的読み取り専用値です。 既定値を指定すると、未設定の設定が取得された場合に有効な値を使用できるようになります。
UrlBase
静的プロパティは、ISettings
API の 2 つのメソッドを使用して設定値の読み取りまたは書き込みを行います。 ISettings.GetValueOrDefault
メソッドは、プラットフォーム固有のストレージから設定の値を取得するために使用されます。 設定に値が定義されていない場合は、その既定値が代わりに取得されます。 同様に、ISettings.AddOrUpdateValue
メソッドは、プラットフォーム固有のストレージに設定の値を保持するために使用されます。
UrlBaseDefault
文字列は、Settings
クラス内で既定値を定義するのではなく、GlobalSetting
クラスからその値を取得します。 次のコード例は、このクラスの BaseEndpoint
プロパティと UpdateEndpoint
メソッドを示しています。
public class GlobalSetting
{
...
public string BaseEndpoint
{
get { return _baseEndpoint; }
set
{
_baseEndpoint = value;
UpdateEndpoint(_baseEndpoint);
}
}
...
private void UpdateEndpoint(string baseEndpoint)
{
RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);
CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);
OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);
BasketEndpoint = string.Format("{0}:5103", baseEndpoint);
IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);
UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);
TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);
LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);
IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);
LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);
}
}
BaseEndpoint
プロパティが呼び出されるたびに、UpdateEndpoint
メソッドが呼び出されます。 このメソッドは、eShopOnContainers モバイル アプリが接続するさまざまなエンドポイントを表す Settings
クラスによって提供される UrlBase
ユーザー設定に基づいて、一連のプロパティを更新します。
ユーザー設定へのデータ バインディング
eShopOnContainers モバイル アプリでは、SettingsView
によって 2 つのユーザー設定が公開されます。 これらの設定によって、Docker コンテナーとして展開されたマイクロサービスからアプリがデータを取得する必要があるかどうか、またはアプリがインターネット接続を必要としないモック サービスからデータを取得する必要があるかどうかの構成が可能になります。 コンテナー化されたマイクロサービスからのデータ取得を選択する場合は、マイクロサービスのベース エンドポイント URL を指定する必要があります。 図 7-1 は、ユーザーがコンテナー化されたマイクロサービスからのデータ取得を選択した場合の SettingsView
を示しています。
図 7-1: eShopOnContainers モバイル アプリによって公開されたユーザー設定
データ バインディングを使用して、Settings
クラスによって公開される設定を取得および設定できます。 これは、ビュー バインドのコントロールによって実現され、モデル プロパティを表示し、Settings
クラス内のプロパティにアクセスし、設定値が変更された場合にプロパティ変更の通知を生成します。 eShopOnContainers モバイル アプリがどのようにビュー モデルを構築してビューに関連付けるかについては、「ビュー モデル ロケーターを使用してビュー モデルを自動的に作成する」を参照してください。
次のコード例は、コンテナー化されたマイクロサービスのベース エンドポイント URL をユーザーが入力できるようにする SettingsView
の Entry
コントロールを示しています。
<Entry Text="{Binding Endpoint, Mode=TwoWay}" />
この Entry
コントロールは、双方向バインディングを使用して、SettingsViewModel
クラスの Endpoint
プロパティにバインドされます。 次のコード例は、Endpoint プロパティを示します。
public string Endpoint
{
get { return _endpoint; }
set
{
_endpoint = value;
if(!string.IsNullOrEmpty(_endpoint))
{
UpdateEndpoint(_endpoint);
}
RaisePropertyChanged(() => Endpoint);
}
}
Endpoint
プロパティを設定すると、指定された値が有効である場合に、UpdateEndpoint
メソッドが呼び出され、プロパティ変更の通知が生成されます。 次のコード例は、UpdateEndpoint
メソッドを示しています。
private void UpdateEndpoint(string endpoint)
{
Settings.UrlBase = endpoint;
}
このメソッドは、ユーザーが入力したベース エンドポイント URL 値で Settings
クラスの UrlBase
プロパティを更新します。これにより、プラットフォーム固有のストレージに永続化されます。
SettingsView
に移動すると、SettingsViewModel
クラス内の InitializeAsync
メソッドが実行されます。 以下のコード例はこのメソッドを示しています。
public override Task InitializeAsync(object navigationData)
{
...
Endpoint = Settings.UrlBase;
...
}
このメソッドによって、Endpoint
プロパティが Settings
クラス内の UrlBase
プロパティの値に設定されます。 UrlBase
プロパティにアクセスすると、Xam.Plugins.Settings ライブラリはプラットフォーム固有のストレージから設定値を取得します。 InitializeAsync
メソッドの呼び出し方法については、「ナビゲーション中にパラメーターを渡す」を参照してください。
このメカニズムにより、ユーザーが SettingsView に移動するたびに、ユーザー設定がプラットフォーム固有のストレージから取得され、データ バインディングによって表示されるようになります。 次に、ユーザーが設定値を変更すると、データ バインディングによって、プラットフォーム固有のストレージにすぐに再度永続化されます。
まとめ
設定を使用すると、アプリの動作を構成するデータをコードから分離できるため、アプリを再構築せずに動作を変更できます。 アプリ設定は、アプリで作成および管理されるデータであり、ユーザー設定はアプリの動作に影響を与え、頻繁に再調整を必要としない、アプリのカスタマイズ可能な設定です。
Xam.Plugins.Settings ライブラリは、アプリとユーザーの設定を永続化および取得するための一貫したタイプ セーフなクロスプラットフォーム アプローチを提供し、データ バインディングを使用してライブラリで作成された設定にアクセスできます。