今回は Xcode で Resource Bundle を作りそれを CocoaPods で配布する方法を紹介する。
なお前提として既に Xcode のプロジェクトが存在するものとする。今回はそこへ Resource Bundle 作成用のターゲットを追加する。
※説明で取り上げているライブラリは実際に下記で見ることができる。
lakesoft / LKDateUtility
上記ライブラリでは日付フォーマットを plistファイルとして、各言語用のメッセージを Localizable.strings として添付する。今回はこれらのファイルを Resource Bundle化する。
1. ターゲットの作成
まず Resource Bundle 作成用のターゲットを新規に作成する。
iOS用には Bundle作成のテンプレートが用意されていないので OS X のものを使う。
Product Name に拡張子 .bundle がついたものが実際のファイル名となる(例では LKDateUtility-Resources.bundle となる)。
2. ターゲットへリソースを追加
ターゲット用のフォルダが作成されるので、そこへ Resource Bundle に含めたいファイルを追加する。
例では LKDateUtility-Resources 配下に LKDateTemplate.plist と Localizable.strings (English/Japanese)を追加している。追加する時はターゲットのチェックを入れておくこと(そうでないと後で空の Bundle ができてしまう)。
3. Build Settings を編集
SDK設定が OS X になっているので iOS に変更する(Latest iOS)。
次に Bundle のビルド先設定 Per-configuration Build Products Path を変更する。
デフォルトでは下記になっている。
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
これを Resources へ変更する。
実体としての Resources フォルダも作成しておく(プロジェクトフォルダの直下)。
4. ビルド
ビルドすると Resources フォルダに LKDateUtility-Resource.bundle が作成される。
5. 作成した bundle をライブラリ本体へ追加
作成できたものをライブラリ本体のターゲットへ追加する。
これでライブラリのソースコード(開発用プロジェクト)から参照できるようになる。開発用プロジェクトの依存ターゲットに指定しておけば、開発時に自動的に bundle をビルドできる。
github へ push すると普通のディレクトリとして表示される。
6. podspec へ bunlde 設定を追加
resource に書く。
ここまでで配布の仕組みは完成。このライブラリを利用するアプリ側で pod install/update すれば .bundleファイルも取り込まれてビルド時にアプリケーションパッケージ内に配置される。
その他
最後にライブラリ内からこの Resource Bundle 内のファイルへのアクセス方法について。これらのファイルは NSBundle 経由でアクセスできる。
NSString *path = [[NSBundle mainBundle] pathForResource:@"LKDateUtility-Resources" ofType:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithPath:path]; // plist の読み込み _keywords = [NSArray arrayWithContentsOfFile:[LKDateUtilityBundle.bundle pathForResource:NSStringFromClass(self) ofType:@"plist"]]; // ローカライズ文字列の取得 s = NSLocalizedStringFromTableInBundle(@"key", nil, bundle, nil);
- - - -
ここまで Resource Bundle を作る方法をくどくどと説明したが、実はもっと簡単に作る方法もある。
リソース管理には*.bundleがおすすめ
ファインダで .bundle ファイルを作りその中にファイルを詰めるだけでいい。特に凝ったことが必要なければこちらでいいかもしれない。
参考情報)
Resource Bundles
iOS Library With Resources
Responses
Leave a Response