この記事では、Xamarin.iOS アプリまたは拡張機能で NSUserDefaults を使って既定の設定を保存する方法について説明します。
NSUserDefaults クラスを使うと、iOS アプリや拡張機能のプログラムで、システム全体の既定値システムと対話できます。 既定値システムを使うと、ユーザーは (アプリの設計に基づいて) 自分の好みに合わせてアプリの動作またはスタイルを構成できます。 たとえば、メートル法とインペリアル法による測定値でデータを表示したり、特定の UI テーマを選択したりできます。
アプリ グループで NSUserDefaults を使うと、特定のグループ内のアプリ (または拡張機能) 間の通信手段にもなります。
ユーザー既定値について
前に説明したように、ユーザー既定値 (NSUserDefaults) をアプリ (または拡張機能) に追加し、エンド ユーザーが実行時にアプリの外観や操作を調整するために変更できる構成可能なオプションを提供するために使用できます。
アプリが初めて実行されたときに、NSUserDefaults はアプリのユーザー既定値データベースからキーと値を読み取り、値が必要になるたびにデータベースを開いて読み取らなくて済むように、それらをメモリにキャッシュします。
重要
Apple は、Synchronize メソッドを呼び出してメモリ内のキャッシュとデータベースを直接同期することを、開発者に推奨しなくなっています。 代わりに、それは一定の間隔で自動的に呼び出されて、メモリ内のキャッシュとユーザーの既定値データベースの同期を維持します。
NSUserDefaults クラスには、文字列、整数、浮動小数点数、ブール値、URL など、一般的なデータ型のユーザー設定値を読み書きするための、便利なメソッドがいくつか含まれています。 他の型のデータは、NSData を使ってアーカイブしてから、ユーザー既定値データベースで読み書きできます。 詳しくは、Apple の「ユーザー設定と設定のプログラミング ガイド」をご覧ください。
共有 NSUserDefaults インスタンスへのアクセス
共有ユーザー既定値インスタンスを使うと、デバイスの現在のユーザーのユーザー既定値にアクセスできます。 共有既定値オブジェクトが存在しない場合は、初めてのアクセス時に作成され、次の情報を使って初期化されます。
- 現在のアプリから解析された既定値で構成される
NSArgumentDomain。 - アプリのバンドル識別子ドメイン。
- すべてのアプリで共有される既定値で構成される
NSGlobalDomain。 - ユーザーの優先言語ごとに個別のドメイン。
- 検索が常に成功するようにアプリで変更できる一時的な既定値のセットを含む
NSRegistrationDomain。
共有ユーザー既定値インスタンスにアクセスするには、次のコードを使います。
// Get Shared User Defaults
var plist = NSUserDefaults.StandardUserDefaults;
アプリ グループの NSUserDefaults インスタンスへのアクセス
前に説明したように、アプリ グループを使うと、NSUserDefaults を使って特定のグループ内のアプリ (または拡張機能) 間で通信できます。 最初に、iOS Dev Center の [Certificates, Identifiers & Profiles] セクションで、アプリ グループと必要なアプリ ID が正しく構成され、開発環境にインストールされていることを確認する必要があります。
次に、アプリまたは拡張機能プロジェクトに、上で作成した有効なアプリ ID の 1 つを割り当てる必要があります。また、アプリ グループを有効にして指定したアプリ バンドルに、Entitlements.plist ファイルを含める必要があります。
これがすべて済むと、次のコードを使って、共有アプリ グループのユーザー既定値にアクセスできます。
// Get App Group User Defaults
var plist = new NSUserDefaults ("group.com.xamarin.todaysharing", NSUserDefaultsType.SuiteName);
group.com.xamarin.todaysharing は、[Certificates, Identifiers & Profiles] で作成された、アクセス対象のアプリ グループです。 詳しくは、アプリ グループの機能に関するドキュメントをご覧ください。
既定値の読み取り
目的のユーザー既定値データベースにアクセスした後は、キーと値のペアと、読み取るデータの型に基づくいくつかの便利なメソッドを使って、既定値から値を読み取ることができます。
ArrayForKey- 指定されたキー値に対するNSObjectsの配列を返します。BoolForKey- 指定されたキーに対するブール値を返します。DataForKey- 指定されたキーに対するNSDataオブジェクトを返します。DictionaryForKey- 指定されたキーに対するNSDictionaryを返します。DoubleForKey- 指定されたキーに対する double 値を返します。FloatForKey- 指定されたキーに対する float 値を返します。IntForKey- 指定されたキーに対する integer 値を返します。StringArrayForKey- 指定されたキー値からStringオブジェクトの配列を返します。StringForKey- 指定されたキーに対する string 値を返します。URLForKey- 指定されたキーに対するNSUrl値を返します。
たとえば、次のコードは、ユーザー既定値からブール値を読み取ります。
// Get Shared User Defaults
var plist = NSUserDefaults.StandardUserDefaults;
...
// Get value
var useHeader = plist.BoolForKey("UseHeader");
既定値の書き込み
上記の値の読み取りと同様に、目的のユーザー既定値データベースにアクセスした後は、キーと値のペアと、書き込むデータの型に基づくいくつかの便利なメソッドを使って、既定値に値を書き込むことができます。
SetBool- 指定されたブール値を指定されたキーに書き込みます。SetDouble- 指定された double 値を指定されたキーに書き込みます。SetFloat- 指定された float 値を指定されたキーに書き込みます。SetString- 指定された string 値を指定されたキーに書き込みます。SetURL- 指定された URL (NSUrl) 値を指定されたキーに書き込みます。
たとえば、次のコードは、ユーザー既定値にブール値を書き込みます。
// Get Shared User Defaults
var plist = NSUserDefaults.StandardUserDefaults;
...
// Save value
plist.SetBool(useHeader, "UseHeader");
...
重要
アプリが初めて実行されたときに、NSUserDefaults はアプリのユーザー既定値データベースからキーと値を読み取り、値が必要になるたびにデータベースを開いて読み取らなくて済むように、それらをメモリにキャッシュします。
まとめ
この記事では、NSUserDefaults クラスと、それを使って、エンド ユーザーが Xamarin.iOS アプリを構成するときに使用できる一連のオプションを提供する方法について説明しました。 さらに、アプリ グループを使って、拡張機能とその親アプリの間、またはグループ内のアプリの間で通信する方法についても説明しました。