我该如何在嵌入式框架中使用Cocoapods?

36

我正在为我的新项目中的自定义视图使用嵌入式框架,以利用Xcode 6中的新@IBDesignable功能,并希望使用Facebook的Pop来对这些视图进行动画处理。我已经使用CocoaPods将Pop添加到项目中,但是嵌入式框架无法访问这些文件('POP/pop.h' file not found)。

我尝试将应用程序目标的CocoaPods相关构建阶段复制到自定义框架目标,但它们不能原封不动地工作。 可行的方法是将Pop文件夹直接复制到嵌入式框架中,但是Xcode告诉我必须将所有的尖括号<POP/pop.h>更改为引号"POP/pop.h"。 我认为还有更好的方法,但我现在想不出来了。


你试过这个吗?http://stackoverflow.com/questions/20465348/cocoapods-installing-a-library-that-contains-an-embedded-framework - Steve Sahayadarlin
2个回答

51
假设在您的Podfile中使用link_with 'MyCustomFramework',其中'MyCustomFramework'是您的嵌入式框架名称,并且已运行pod install。选择您的Project文件(右上角蓝色)并进入“Build Settings”。 然后,找到“Allow non-modular includes in Framework Modules”,将其设置为YES,对于项目文件(蓝色)和自定义框架目标(例如MyCustomFramework-橙色"lunchbox case"图标)均要设置。
然后您可以在主MyCustomFramework.h文件中包含cocoa pods内容。 然后在应用程序目标中导入'@import MyCustomFramework;',您将获得其他CocoaPods可用性。(例如,显示从ObjectiveSugar访问'each')。
是否应该这样做是一个单独的问题,但这使您的自定义框架可以在其中包括CocoaPods库,然后允许应用程序目标仅包括您的自定义框架并获取所有CocoaPods。
很抱歉有多张图片,但我喜欢视觉效果。

1
这看起来很有前途,但我遇到的问题是当我尝试使用#import“AFNetworking.h”或许多变体时,它无法编译,显示文件未找到。而在框架中的任何其他类中,导入都可以正常工作。似乎我的框架头文件看不到AFNetworking? - Chris Wagner
1
在赏金到期之前授予您奖励...希望您能解决我的导入问题,以结束这个问题。谢谢。 - Chris Wagner
1
有人可以上传一个示例项目到GitHub上吗? - fatuhoku
1
你能发一下你的Podfile吗?如果我想在多个目标中使用相同的pod,包括Cocoa Touch框架,该怎么办? - yong ho
4
由于link_with不再受支持,我们现在应该怎么办? - shmim
显示剩余8条评论

3
我猜你正在修改框架以使用Pop。在这种情况下,您还需要将Pop头文件路径添加到框架Build Settings的搜索头文件路径中。
但是如果您正在修改框架,也可以为其创建一个podspec,让CocoaPods处理所有事情(并向创建者发送拉取请求)。
关于赏金问题。
一个框架永远不应该嵌入其他库。例如,如果您想在自己的库中使用AFNetworking:
- 在您自己的框架安装说明中声明需要AFNetworking。 - 如果您分发二进制文件,则只需本地构建与AFNetworking头文件的链接。用户将需要在链接其应用程序时提供自己的AFNetworking。 - 如果您使用源代码分发自己的框架(如果用户必须自行构建),则要求在安装步骤中设置AFNetworking头文件路径到您的框架构建设置头文件搜索路径,并将其预设为常见路径,例如POD_ROOT等。
然后它可以工作,但您需要复杂的安装说明,用户必须手动添加任何资源,很难控制用户添加的AFNetworking版本,并且大多数人都不会升级您的框架,因为这可能会破坏他们的设置。这是支持CocoaPods创建podspec的好理由(如果您确实希望保持框架/静态库项目的维护)。

1
也许我应该自己发一个问题,而不是在这个问题上设置赏金。但我认为它与此密切相关。在我的情况下,我想在我的嵌入式框架中包含Pods,但在我的应用程序目标中访问它们(我正在处理扩展)。因此,我的嵌入式框架需要AFNetworking,但我的应用程序也可以从AFNetworking中受益。目前,如果我将AFNetworking设置为两个目标的依赖项,我会收到一些运行时错误,因为使用方式不明确,因为应用程序二进制文件和框架二进制文件具有相同的API。只有将其包含在框架依赖项中... - Chris Wagner
1
我们有选择吗?我印象中为了在应用扩展和容器应用之间共享代码,需要创建嵌入式框架并链接到两个目标,是这样吗? - Chris Wagner
@ChrisWagner 不一定 - 你可以将文件添加到应用程序扩展和应用程序本身中 - 这会有一些重复,但似乎比框架更简单 - 特别是如果涉及Swift。 - Ying
你也可以将你的CocoaTouch框架转换成一个本地私有pod,它具有自己的子规格依赖于CocoaPod库。 - Ari Braginsky
使用Cocoapods来实现您所描述的功能是否可行?看起来您希望使用嵌入式框架的应用程序链接到第三方库,并且共享框架代码只需知道头文件?也许Cocoapods对于这种项目结构并不是正确的工具? - John Clayton
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接