【问题标题】:Automatically adding a dynamic library to embedded frameworks via Cocoapods通过 Cocoapods 自动将动态库添加到嵌入式框架
【发布时间】:2015-06-11 17:48:09
【问题描述】:

我正在创建一个自定义的 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

我的理解是,作为第 3 方自定义框架,我必须将其添加为嵌入式二进制文件(由于 Apple 担心动态链接随机框架)。对吗?

如果没有,我可以以某种方式更改我的框架或 Podspec 文件,这样我就不需要嵌入它(不使其成为静态库)?

否则,有没有办法自动将框架添加到 pod install 上的嵌入式二进制文件?

【问题讨论】:

    标签: ios objective-c xcode ios8 cocoapods


    【解决方案1】:

    默认情况下,cocoapods 尝试将 pod 链接为静态库。您可以通过在 Podfile 中添加 use_frameworks! 来强制 cocoapods 使用框架。或者您可以尝试在您的库 podspec 文件中适当地设置xcconfig 或/和vendored_framework 以与您的框架链接。我在Sparkle project's podspec file 中看到了一个很好的例子。 Sparkle 使用vendored_framework 解决方法来获得在 OSX 中工作的动态链接(我相信是因为 cocoapods repo 中的this 问题)。

    【讨论】:

    • 感谢您的回复。我复制了 Sparkle 项目的 podspec 中的设置,但仍然无法解决链接问题。现在,我们将强制我们的消费者应用手动嵌入框架。
    • Sparkle 有点棘手 - 它引用了已编译的框架,并且嵌入工作正常
    【解决方案2】:

    我遇到了这个确切的问题(Objective C 框架构建为带有动态库的模块),终于找到了解决方案:

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

    很遗憾,这必须由使用您的框架的人来完成。如果您有一个不需要用户方面任何东西的解决方案,请告诉我。

    See Screenshot here

    更新:

    似乎如果您不指定 module_name 并将您的框架添加到 podspec 中的 vendored_frameworks,则不需要我上面提到的步骤,因此不需要在用户端进行交互。

    【讨论】:

    • 您是否需要提供这些框架的绝对路径?还是只是框架的名称?
    • 在我的 podspec 我有这样的东西:s.vendored_frameworks = 'MyFramework.framework'。但是,我也使用具有相同输入的 preserve_path 属性(不确定这是否会有所不同)。
    猜你喜欢
    • 2017-06-29
    • 2018-05-26
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多