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

広告を使わないのに広告ライブラリがあってリジェクト

2014年2月10日月曜日 | Published in | 1 コメント

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

備忘メモ。アプリは無料広告版と有料版があり、どちらも同じコードを使っているので後者の有料版でリジェクトにあった。昨年申請した時はパスしたが、今月のバージョンアップでリジェクト。

リジェクトの説明には AdSupport.framework他の広告系コードを無く指南の他、nm コマンドを使えば良いなど結構親切にかかれていた。

(参考)iOSアプリのバイナリの中身を見る & Private APIの利用チェックツールの紹介

今回の場合 AdSupport.frameworkの他、サードパーティの広告ライブラリを使っていたので、それらを有料版のターゲットから外した。


上記の KickCalPro の方が有料版(広告なし)。


コードの方は有料版のターゲットに IS_PRO というシンボルを設定し、#ifdefで制御した。


(参考)How to define Preprocessor Macros in Xcode

イメージ
#ifndef IS_PRO
 広告ありのケースの処理
  :
#endif


その後の再審査で無事通過した。

- - - -

その後、無料版のバージョンアップでも同じリジェクト。このアプリは操作結果画面に広告が出るタイプなのでレビューアがそれを見落としたらしい。それを指摘すると速攻で審査が通った。



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