gpt4 book ai didi

ios - 无法从动态加载的 NSBundle 中获取 CFBundleIdentifier

转载 作者:行者123 更新时间:2023-11-29 11:01:40 30 4
gpt4 key购买 nike

我正在尝试动态加载一个包,以便在少数情况下代替 ma​​inBundle。我设法用一些资源加载了包,比如 Localizable.strings 等等。当我对该包使用 localizedStringForKey 时,会加载正确的本地化字符串。这就是说它有效

不过,我什至想要一个包标识符。因此,我将 info.plist 文件添加到包文件夹的根目录,其中包含 CFBundleIdentifier 字符串。这个,不行当我尝试通过

获取标识符时
[myBundle bundleIdentifier]

我得到一个空值。我试图将文件命名为

Info.plist

MyBundle-Info.plist

其中 MyBundle 是包的名称(内容存储在 MyBundle.bundle 中)。但运气不好。

我真的不明白哪里出了问题。我必须在信息 plist 中设置其他键吗?或者这可能是一个命名问题?任何帮助将不胜感激。

最佳答案

我最终查看了 Core Foundation(毕竟 NSBundle 是基于 CFBundle)的源代码并找出了问题所在。所以..

负责收集info.plist内容的函数是CFBundleGetInfoDictionary .每当请求理论上包含在 plist 中的信息时,都会调用它。

查看CFBundle.cCFBundleGetInfoDictionary 的实现检查包的 _infoDict 字段是否已初始化,如果未初始化,则对其进行初始化:

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

通过在我的CFBundle 上调用该函数我没有任何运气,所以我猜一定是在_CFBundleCopyInfoDictionaryInDirectoryWithVersion 中发生了错误。 .

查看 source code ,我注意到,根据 bundle-_version,使用不同的路径来搜索信息 plist。在这种情况下,版本 取决于用于设置 bundle 的目录结构。确切地说,我的版本是 0,因为,正如函数 _CFBundleURLLooksLikeBundleVersion 中指定的那样(在 bundle 初始化期间使用),bundle 与 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 在 _CFBundleCopyInfoDictionaryInDirectoryWithVersion 中初始化。基于版本 0

    infoURLFromBase = _CFBundleInfoURLFromBase0;

定义为:

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

太棒了...我已经将我的 Info.plist 放在了 Resources 目录中,而不是放在外面,现在它可以工作了。

我想我在某种程度上是个白痴,因为我完成了所有这些旅行,因为这些东西可能写在文档的某个地方,但我找不到它:(

关于ios - 无法从动态加载的 NSBundle 中获取 CFBundleIdentifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15640907/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com