結局、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ディレクトリに配置しましたが、動作するようになりました。
このようなものがおそらくドキュメントのどこかに書かれていることを考えると、私はどういうわけかこのすべての旅行をしたことのばかだと思いますが、私はそれを見つけることができませんでした:(