構成管理

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 を示しています。

User settings exposed by the eShopOnContainers mobile app

図 7-1: eShopOnContainers モバイル アプリによって公開されたユーザー設定

データ バインディングを使用して、Settings クラスによって公開される設定を取得および設定できます。 これは、ビュー バインドのコントロールによって実現され、モデル プロパティを表示し、Settings クラス内のプロパティにアクセスし、設定値が変更された場合にプロパティ変更の通知を生成します。 eShopOnContainers モバイル アプリがどのようにビュー モデルを構築してビューに関連付けるかについては、「ビュー モデル ロケーターを使用してビュー モデルを自動的に作成する」を参照してください。

次のコード例は、コンテナー化されたマイクロサービスのベース エンドポイント URL をユーザーが入力できるようにする SettingsViewEntry コントロールを示しています。

<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 ライブラリは、アプリとユーザーの設定を永続化および取得するための一貫したタイプ セーフなクロスプラットフォーム アプローチを提供し、データ バインディングを使用してライブラリで作成された設定にアクセスできます。