在 NSBundle 中使用 ConnectionKit 框架
Posted
技术标签:
【中文标题】在 NSBundle 中使用 ConnectionKit 框架【英文标题】:Using the ConnectionKit Framework Within an NSBundle 【发布时间】:2012-02-17 05:32:08 【问题描述】:更新
我已经花时间学习如何使用 install_name_tool
和 otool
来正确执行此操作,并在此处记录了该过程: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.mainBundle().URLForResource` 总是返回 `nil`