1

いくつかのケースでmainBundleの代わりに使用するために、バンドルを動的にロードしようとしています。Localizable.stringsなどのいくつかのリソースをバンドルにロードすることができました。そして、そのバンドルに対してlocalizedStringForKeyを使用すると、正しいローカライズされた文字列がロードされます。これは、それが機能するということです。

それでも、バンドル識別子も取得したいと思います。したがって、バンドルフォルダーのルートに、 CFBundleIdentifier文字列を含むinfo.plistファイルを追加しました。これは機能しません。経由で識別子を取得しようとすると

[myBundle bundleIdentifier]

null値を取得します。私はファイルに両方の名前を付けようとしました

Info.plist

MyBundle-Info.plist

ここで、MyBundleはバンドルの名前です(コンテンツはMyBundle.bundleに保存されます)。しかし、運はありません。

私は本当に何が悪いのかわかりません。info plistに他のキーを設定する必要がありますか?それとも名前の問題ですか?どんな助けでもありがたいです。

4

1 に答える 1

2

結局、Core Foundation(結局、NSBundleはCFBundleに基づいています)のソースコードを見て、どこに問題があるのか​​を突き止めました。それで..

info.plistコンテンツの収集を担当する関数はCFBundleGetInfoDictionaryです。これは、plistに理論的に含まれている情報が要求されたときにいつでも呼び出されます。

CFBundle.cを見ると、CFBundleGetInfoDictionaryの実装は、バンドルの_infoDictフィールドが初期化されているかどうかをチェックし、初期化されていない場合は初期化します。

if (!bundle->_infoDict) bundle->_infoDict = _CFBundleCopyInfoDictionaryInDirectoryWithVersion(CFGetAllocator(bundle), bundle->_url, bundle->_version);

CFBundleでその関数を呼び出すことで運がなかったので、_CFBundleCopyInfoDictionaryInDirectoryWithVersionで何か問題が発生したに違いないと思いました。

ソースコードを見ると、bundle-> _versionに応じて、infoplistの検索に異なるパスが使用されていることに気付きました。この場合のバージョンは、バンドルのセットアップに使用されたdir構造によって異なります。正確には、私のバージョンは0でした。これは、関数_CFBundleURLLooksLikeBundleVersion(バンドルの初期化中に使用)で指定されているように、Resourcesディレクトリとのバンドルは次のとおりであるためです。

// check for existence of "Resources" or "Contents" or "Support Files"
    // but check for the most likely one first
    // version 0:  old-style "Resources" bundles
    // version 1:  obsolete "Support Files" bundles
    // version 2:  modern "Contents" bundles
    // version 3:  none of the above (see below)
    // version 4:  not a bundle (for main bundle only)

したがって、ストーリーを終了するために、Info.plistのベースURLは、バージョン0に基づいて_CFBundleCopyInfoDictionaryInDirectoryWithVersionで初期化されます。

    infoURLFromBase = _CFBundleInfoURLFromBase0;

それは次のように定義されます:

#define _CFBundleInfoURLFromBase0 CFSTR("Resources/Info.plist")

Soooo ... Info.plistを外部ではなくResourcesディレクトリに配置しましたが、動作するようになりました。

このようなものがおそらくドキュメントのどこかに書かれていることを考えると、私はどういうわけかこのすべての旅行をしたことのばかだと思いますが、私はそれを見つけることができませんでした:(

于 2013-03-26T16:58:31.367 に答える