コマンドラインツールで設定ファイルを使う方法
いろいろあると思うけど、実行ファイルと同じディレクトリ(またはその下のResourceディレクトリ)に.plistファイルが配置されるようにして、NSBundleの-pathForResource:ofType:で引っ張ってくるのが楽な気がする。
ファイル(Config.plist)の内容
{ /* database connection configuration */ connectionDictionary = { dbname = "hatebu"; host = "localhost"; port = "5432"; user = "postgres"; }; tableInfos = { hatebu_user = { tableName = "hatebu_user"; primaryKeyNames = ("record_id"); }; hatebu_favorite = { tableName = "hatebu_favorite"; primaryKeyNames = ("src_id", "dest_id"); }; }; /* Crawling URL */ hotentryRSSURL = "http://b.hatena.ne.jp/hotentry?mode=rss"; entryRSSURLFormat = "http://b.hatena.ne.jp/entry/rss/%@"; favoriteHTMLURLFormat = "http://b.hatena.ne.jp/%@/favorite"; }
ProjectBuilderでの設定方法
- プロジェクトディレクトリ下にResourcesというディレクトリを作成。その下にConfig.plistを保存。
- プロジェクト下で右クリック→「追加」→「既存のファイル」で上のResourcesディレクトリを選択して「追加」
- 「グループとファイル」(左側のカラム)で右クリック→「新規ビルドフェーズ」→「新規コピーファイル・ビルドフェーズ」を選ぶ。ターゲット内に「ファイルをコピー」がもう一つ追加される。
- 「ファイルをコピー」のインスペクタを開き、下位パスを「Contents/Resources」に設定
- 「グループとファイル」で2.で追加したResourcesディレクトリ内の設定ファイル(Config.plist)を3.のビルドフェーズにドラッグ&ドロップする。
これでビルド時にbuildディレクトリの下にContents/Resources/というディレクトリが出来、その中にConfig.plistがコピーされるようになる。install時はバイナリファイルと同じ階層にContentsフォルダが出来る。4.を省略すると、バイナリファイルと同階層にConfig.plistが出来る。
プログラムから設定値の内容を取得
main関数などで以下のように記述し、設定ファイルの値を読み込む。
int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Configuration NSDictionary *configuration = nil; // mailBundleからパスを取得 NSString *configurationPath = [[NSBundle mainBundle] pathForResource:CONFIGURATION_FILENAME ofType:CONFIGURATION_EXT]; if (configurationPath) { // NSDictionaryとしてファイルの内容を読み込む configuration = [NSDictionary dictionaryWithContentsOfFile:configurationPath]; NSLog(@"configuration = %@", configuration); // NSUserDefaultsにデフォルト時の値として登録 [[NSUserDefaults standardUserDefaults] registerDefaults:configuration]; } // your code... [pool release]; }
この例ではNSUserDefaultsにregisterDefaultsで登録している。こうしておくと、ファイルを変更しなくてもdefaultsコマンド(defaults write)で設定値の一部だけを上書きできる。
設定値を使用する側の例
#define CONNECTION_DICTIONARY_KEY @"connectionDictionary" .... - (NSDictionary *)connectionDictionary { NSDictionary *connectionDictionary = [[NSUserDefaults standardUserDefaults] dictionaryForKey:CONNECTION_DICTIONARY_KEY]; if (!connectionDictionary) { raiseConfigException(CONNECTION_DICTIONARY_KEY); } return connectionDictionary; }