在 NSBundle 中使用 ConnectionKit 框架

Posted

技术标签:

【中文标题】在 NSBundle 中使用 ConnectionKit 框架【英文标题】:Using the ConnectionKit Framework Within an NSBundle 【发布时间】:2012-02-17 05:32:08 【问题描述】:

更新

我已经花时间学习如何使用 install_name_toolotool 来正确执行此操作,并在此处记录了该过程:Using Frameworks Within NSBundles


我想在我正在制作的 NSBundle 中使用 Connection Kit 框架。

为了让我的包成功加载框架,我将dynamic library install name 更改为使用@loader_path 而不是@executable_path

在我的 NSBundle 中构建并包含框架之后,然后构建它,运行加载我的包的程序,我的包无法加载并产生以下输出:

Error loading MyBundle.rwplugin/Contents/MacOS/MyBundle:  dlopen(/Users/facelap/Library/Developer/Xcode/DerivedData/MyBundle-hiyhdkndcnuhspfqwcuyneqobeou/Build/Products/Debug/MyBundle.rwplugin/Contents/MacOS/MyBundle, 265): Library not loaded: @executable_path/../Frameworks/DAVKit.framework/Versions/A/DAVKit
  Referenced from: /Users/facelap/Library/Developer/Xcode/DerivedData/MyBundle-hiyhdkndcnuhspfqwcuyneqobeou/Build/Products/Debug/MyBundle.rwplugin/Contents/MacOS/../Frameworks/Connection.framework/Versions/A/Connection
  Reason: image not found

似乎Connection Kit本身使用了一个框架。

我也有这个框架的来源。我尝试将其dynamic library install name 设置为@loader_path,但这导致了类似的输出(并且捆绑包无法加载)。

对于要在 NSBundle 中使用的框架中的框架,dynamic library install name 的合理条目是什么?

【问题讨论】:

【参考方案1】:

查看崩溃日志。它说你捆绑不能加载 DAVKit.framework 所以最简单的方法 - 它重建 ConnectionKit 框架,而不是嵌入 DAVKit.xcodeproj 插入所有 DAVKit 源。它最简单但更正确的方法 - ConnectionKit 和 DAVKit 框架的设置安装路径。 它的链接应该可以帮助您: embedding frameworks in loadable bundles

【讨论】:

谢谢,我可以试试。您能否澄清“ConnectionKit 和 DAVKit 的设置安装路径...”的意思?我不明白你想说什么。 在 ConnectionKit 工作的情况下构建 DAVKit,感谢您的提示 :)【参考方案2】:

您应该将您的捆绑包与 DAVKit 链接并在其中包含它,就像您包含 ConnectionKit 一样。这避免了交付多个深度的框架

【讨论】:

理想情况下,我不想这样做有两个原因。 #1 是这会使更新框架变得更加困难,即不仅仅是在框架上做一个git pull 然后构建和复制它。 #2 简单地将其他框架复制到我的项目中无论如何都行不通,因为我需要更正框架的install path。我在这里写了如何做到这一点:pagesofinterest.net/blog/2012/05/… 啊,那你没有ConnectionKit作为子模块吗? 不,但老实说,在我阅读您的评论之前,我没有想到这一点!我一直将它用作外部框架。现在效果很好,我学会了如何正确使用install_name_tool

以上是关于在 NSBundle 中使用 ConnectionKit 框架的主要内容,如果未能解决你的问题,请参考以下文章

无法在 iphone 单元测试中从 NSBundle 加载文件

如何卸载 NSBundle?

`NSBundle.mainBundle().URLForResource` 总是返回 `nil`

使用来自 [[NSBundle mainBundle] resourcePath] 的路径

NSBundle 返回 NULL

使用 OCUnit 进行单元测试时的 NSBundle 返回(空)