如何使用弱链接的 CocoaPods 库构建 iOS 框架

Posted

技术标签:

【中文标题】如何使用弱链接的 CocoaPods 库构建 iOS 框架【英文标题】:How to build an iOS framework with weak-linked CocoaPods libraries 【发布时间】:2015-01-03 15:39:24 【问题描述】:

我正在尝试使用 Xcode 6 提供的用于创建 Cocoa Touch 框架的新模板来构建 ios 框架 (Test.framework)。 该框架具有在 Podfile 中指定的不同依赖项(如 AFNetworking 或 FacebookSDK)。我不希望框架中包含依赖项,我只想链接它们。

问题是当我构建框架时,libPods.a 被链接并包含在内。 问:如何链接 libPods.a 库,但不将其包含在框架中?


更多详情:

我读过关于弱链接的文章: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html 但是我在玩项目设置方面没有太多经验,我不是专业人士。

我尝试将 libPods.a 标记为“可选”,但没有任何改变,仍然包含依赖项。

我尝试从 Build Phases 的“Link Binary With Libraries”部分中删除 libPods.a,但出现此错误(在清理项目文件夹并再次构建之后):

ld: library not found for -lPods-MyFramework-AFNetworking

我尝试从“其他链接器标志”中删除所有标志,但它给了我未定义的符号:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_FBSession", referenced from:
      objc-class-ref in TestClass.o
ld: symbol(s) not found for architecture armv7

以下是包含库的干净项目的源代码: https://www.dropbox.com/sh/0ymuzw6kiagz02j/AABzyHiZVaQQvBEnjBgRBq3ua?dl=0

【问题讨论】:

【参考方案1】:

我还不能发表评论,所以我会在这里回答。 我认为你不能那样做。 Cocoapods 创建一个静态库而不是动态库,因此所有代码在编译时都应该存在并嵌入到您的框架中。

Cocoapods documentation,转到“幕后发生了什么?”详细解释

如果您想为一些常用的 pod 组合一些基本配置,最好的方法可能是制作一个自定义 cocoapod,并将其他的作为依赖项。这样您就可以依靠 cocoapods 来管理版本并根据您的喜好更新代码。我自己也在使用类似的方法,我对结果非常满意。

【讨论】:

有人知道 cocoapods 中的“-weak_framework”是什么吗?【参考方案2】:

下面的 post_install 代码位于 Podfile 的底部。它允许您指定您想要的目标以及弱链接的框架。我们能够利用它来弱链接动态框架目标中的框架,但在编译我们的核心应用程序时继续正确链接它。

targets_to_weaklink=['Target1']
frameworks_to_weaklink=['Framework1']
post_install do |installer|
  targets_to_weaklink.map!|t| t="Pods-#t"
  installer.pods_project.targets.each do |target|
    next unless targets_to_weaklink.include?(target.name)

    target.build_configurations.each do |config|
      base_config_reference = config.base_configuration_reference
      unless base_config_reference.nil?
        xcconfig_path = base_config_reference.real_path
        xcconfig = File.read(xcconfig_path)
        frameworks_to_weaklink.each do |framework|
          xcconfig = xcconfig.gsub(/-framework "#framework"/, "-weak_framework \"#framework\"")
        end
        File.open(xcconfig_path, "w")  |file| file << xcconfig 
      end
    end
  end
end

【讨论】:

以上是关于如何使用弱链接的 CocoaPods 库构建 iOS 框架的主要内容,如果未能解决你的问题,请参考以下文章

使用 PayPal 移动 SDK 的 iOS 构建错误

ios技术分享| iOS 发布 framework 到 Cocoapods 以及常见问题

ios技术分享| iOS 发布 framework 到 Cocoapods 以及常见问题

[iOS]如何删除工程里面用cocoapods导入的第三方库

Swift dyld:未加载库 - 使用 CocoaPods

创建反应本机库并将CocoaPods添加到该库