NSBundle、plist、および Obj-c 静的ライブラリ内のその他のリソース
質問
Xcode で静的ライブラリを作成しました。これは他のプロジェクトでも問題なく使用できます。ただし、plist などのリソースの場合、ライブラリで参照される plist は、プロジェクトが使用されるメイン プロジェクトに含める必要があることがわかりました。
私の静的ライブラリ プロジェクトでは、ターゲットの「バンドル リソースのコピー」フェーズに plist が含まれています。私のコードでは、次のことを行っています。
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
mainBundle を使用し、MyClassParams.plist がメイン プロジェクトに含まれていれば、すべて問題ありません。MyClassParams.plist がライブラリ プロジェクトに含まれている場合、機能しません。
[NSBundle mainBundle] が使用すべき間違った静的メソッドを参照しているという仮定に基づいて、それを次のように置き換えました。
NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]];
これもうまくいきませんでした。
では、plist やその他のリソースを静的ライブラリに含めることは可能でしょうか。それとも、ライブラリが使用されるプロジェクトに必要なものはすべて含める必要があるのでしょうか?
解決
静的ライブラリは、バンドルに含まれていません。あなたが埋め込まれたフレームワークを含めることはできませんので、iPhone上で、効果的にあなたが書いたすべてのコードがmainBundleになります。
そうです、あなたはに静的なフレームワークをリンクされているプロジェクトにすべてのリソースをコピーする必要があります。
他のヒント
静的ライブラリにリソース ファイルを含めることができないことはわかっています (これはフレームワークが行うことです)。私のプロジェクトでは別のソリューションを使用しています。
静的ライブラリ「YYY」プロジェクト内:
- 「Loadable Bundle」ターゲットを静的ライブラリ プロジェクトに追加します (Add Target、Cocoa、Loadable Bundle)
- このターゲットを静的ライブラリターゲットの依存関係として追加します
メインプロジェクト内:
- リンクしてください
libYYY.a
- バンドルを追加する
YYY.bundle
コピーしたリソースファイルに
これにより、静的ライブラリで使用されるリソース ファイルはメイン プロジェクトで管理されなくなります。私は持っていると言ってください foo.png
静的ライブラリの画像、私は使用します
[UIImage imageNamed:@"YYY.bundle/foo.png"]
次のように plist を取得できます。
NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
以下に 2 つのスクリーンショットを示します。
- 左:ロード可能なバンドルターゲットを含む静的ライブラリプロジェクト
- 右:「Link Binary With Libraries」に追加されたスタティック ライブラリ バイナリと、「Copy Bundle Resources」に追加されたリソース バンドルを示しています。
私は、しかし、私はバンドルを取得することができ、@Jiloucが提案すべてを続くが、その中のファイルの取得に失敗しました。私が試したの両方二つの方法(@"yyy.bundle/image"
又はstaticlib pathforresource...
)
そこで!私は、以下の方法を使用し、それが働いた。
NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]];
NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName];
NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];