NSBundle、plist、および Obj-c 静的ライブラリ内のその他のリソース

StackOverflow https://stackoverflow.com/questions/1657610

  •  11-09-2019
  •  | 
  •  

質問

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」に追加されたリソース バンドルを示しています。

Static library project Main project

私は、しかし、私はバンドルを取得することができ、@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];
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top