如何正确设置一个Podfile,其中包含一个框架目标和一个使用该框架的应用程序目标。

11

有以下项目结构:

  • 应用程序目标位于Xcode项目(App.xcodeproj),依赖于位于不同Xcode项目中的框架目标(Framework.xcodeproj)。
  • 应用程序目标依赖于Material Pod
  • 框架目标依赖于AFNetworking Pod。

CocoaPods支持这种设置吗?

我的第一次尝试是做这样的事情:

platform :ios, '9.0'
use_frameworks!

target 'App' do
  workspace 'App.xcworkspace'
  project 'App.xcodeproj'  
  pod 'Material'
end

target 'Framework' do
  workspace 'App.xcworkspace'
  project 'Framework/Framework.xcodeproj'
  pod 'AFNetworking'
end

但是应用程序在启动时崩溃,并显示以下错误:

dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetworking

Referenced from: /Users/ruenzuo/Library/Developer/Xcode/DerivedData/App-aayvulxvruuarudtheuilepmmctk/Build/Products/Debug-iphonesimulator/Framework.framework/Framework

Reason: image not found

这很有道理,因为CocoaPods不知道应用程序和框架之间的关系。实际上,在运行pod install后我收到以下警告:

[!] The Podfile contains framework targets, for which the Podfile does not contain host targets (targets which embed the framework).
If this project is for doing framework development, you can ignore this message. Otherwise, add a target to the Podfile that embeds these frameworks to make this message go away (e.g. a test target).

我随后尝试将Framework目标嵌入到Application目标中,就像这样:

platform :ios, '9.0'

use_frameworks!

target 'App' do
  workspace 'App.xcworkspace'
  project 'App.xcodeproj'
  pod 'Material'
  target 'Framework' do
    workspace 'App.xcworkspace'
    project 'Framework/Framework.xcodeproj'
    pod 'AFNetworking'
  end
end

但是它并没有起作用。我设法让它工作的唯一方法是像这样:

platform :ios, '9.0'
use_frameworks!

target 'App' do
  workspace 'App.xcworkspace'
  project 'App.xcodeproj'
  pod 'Material'
  pod 'AFNetworking'
end

target 'Framework' do
  workspace 'App.xcworkspace'
  project 'Framework/Framework.xcodeproj'
  pod 'AFNetworking'
end

但是重复使用 AFNetworking pod 让我感觉做错了什么。而且,我没能成功消除警告,很明显我只是通过让 CocoaPods 将 AFNetworking pod 复制到应用程序框架目录中来强行解决这个问题。

有人成功实现过这样的操作吗?


也许你正在打开 yourProject.xcodeproject 文件,但是你需要打开 yourProject.xcworkspace 文件而不是 yourProject.xcodeproject。在成功安装 Pods 后进行操作。 - NAVEEN KUMAR
是的,我正在打开正确的文件。 - UnsafePointer
1个回答

3
关键是将您的框架目标添加到应用程序目标的“Target Dependencies”构建阶段中,如下所示:

Xcode screenshot

由于某些原因,CocoaPods 依赖于 "Target Dependencies" – 将库/框架添加到 "Link With Binary Libraries" 阶段是不够的。你的 Podfile 应该像这样:

project 'CocoapodsTest'

target 'CocoapodsTest' do
    pod 'AFNetworking'
end

target 'SampleLibrary' do
    pod 'Masonry'
end

运行pod install后,您可以检查应用程序目标的"Other Linker Flags",以验证它将您的应用程序和库的依赖项都转发给链接器:

Xcode screenshot


1
2023年,它仍需要“目标依赖项”才能正常工作。这让我花费了太长时间才找到。谢谢。 - import this

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