通过Cocoapods自动将动态库添加到嵌入式框架中

4
我正在创建一个自定义的Objective-C框架(动态库),并试图使用Cocoapods将其引入消费者应用程序中。如果我不将该框架添加为嵌入式二进制文件,就会出现一个非常严重的运行时错误:
dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework
Referenced from: /private/var/mobile/Containers/Bundle/Application/XXX/MyFramework.app/MyFramework
Reason: image not found

我的理解是,作为第三方自定义框架,由于苹果对动态链接随机框架的担忧,我必须将其添加为嵌入式二进制文件。是这样吗?

如果不是,我是否可以通过更改框架或Podspec文件的方式来避免嵌入它(而不使其成为静态库)?

否则,有没有一种方法可以在pod install时自动添加框架到嵌入式二进制文件中?

2个回答

2

默认情况下,CocoaPods尝试将pods链接为静态库。您可以通过在Podfile中添加use_frameworks!来强制CocoaPods改用框架。或者您可以尝试在您的库podspec文件中适当设置xcconfig或/和vendored_framework以链接您的框架。我在Sparkle项目的podspec文件中看到了一个很好的例子。Sparkle使用vendored_framework解决方法在OSX中实现动态链接(我认为这是因为CocoaPods仓库中的问题)。


感谢您的回复。我已经复制了Sparkle项目podspec中的设置,但我仍然无法解决链接问题。现在我们只能强制我们的消费者应用程序手动嵌入框架。 - mveritym
Sparkle有点小技巧 - 它引用了编译后的框架,嵌入工作正常。 - Sega-Zero

0

我曾经遇到过这个问题(使用Objective C框架构建动态库模块),最终找到了解决方案:

在pod install之后,您必须进入主项目的Build Phases中的Embed Pods Frameworks并将MyFramework.framework添加到Input Files部分。如果您的框架与bundle一起分发,则必须将其添加到同一选项卡中的Copy Pods Resources部分。

不幸的是,这必须由使用您的框架的人完成。如果您有不需要用户端任何操作的解决方案,请告诉我。

请在此处查看屏幕截图

更新:

似乎如果您没有指定module_name并将您的框架添加到podspec中的vendored_frameworks中,则不需要执行上述步骤,因此用户无需进行任何交互。


您需要提供这些框架的绝对路径吗?还是只需要框架的名称? - Fergal Rooney
在我的podspec中,我有这样的内容: s.vendored_frameworks = 'MyFramework.framework'。 然而,我还使用了preserve_path属性与相同的输入(不确定这是否有所区别)。 - Mihai Costiug

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