Resource Bundle の作り方と CocoaPodsでの配布

2014年2月11日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Resource Bundle とは画像やXibを所定の形式(.bundle)でまとめたもの。複数のファイルを1つにまとめられる他、ファイル名の名前空間を分離するのにも使える。用途としてはライブラリで使う画像や文字列(Localizable.strings)などを Resource Bundle にまとめて、ソースコードと一緒に配布する場面などで使われる。実際 CocoaPodsではライブラリ(のリソース)の配布形態として Resource Bundle を推奨している(Podspec Syntax Reference/resources)。

今回は 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

人気の投稿(過去 30日間)