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

Vla*_*lad 13 iphone frameworks weak-linking ios cocoapods

我正在尝试使用Xcode 6提供的新模板来构建一个iOS框架(Test.framework)来创建Cocoa Touch Frameworks.该框架具有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
Run Code Online (Sandbox Code Playgroud)

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

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

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

jka*_*ter 6

下面的 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
Run Code Online (Sandbox Code Playgroud)


Pab*_*rez 1

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

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

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