这是使用嵌入式可可豆荚创建动态/嵌入式框架的正确方法吗?

时间:2017-07-26 06:50:41

标签: ios swift3 cocoapods embedded-framework

我正在尝试创建一个动态框架,以便在我的应用的各种扩展中共享代码。

问题:

这是我的项目结构。

enter image description here

MyFrameworks是我的应用程序的网络层,它固有地使用Alamofire。所以我的pod文件的结构如下。

platform :ios, '9.0'
use_frameworks!

workspace 'CocoaPodsProjectworkspace'

def shared_pods
    pod 'Alamofire'
    pod 'SwiftyJSON'
end

target 'CocoaPodsProject' do
    project 'CocoaPodsProject.xcodeproj'
    # Pods for CocoaPodsProject
end

target 'MyFramework' do
    project 'MyFramework/MyFramework.xcodeproj'
    shared_pods
end

target 'CocoaPodsProjectTests' do

end

target 'CocoaPodsProjectUITests' do

end

当我将它作为嵌入式二进制文件拖到我的Main项目时构建框架时,我得到了错误。

  

dyld:未加载库:.framework / Alamofire参考自:   /Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework   原因:未找到图像

我尝试过的解决方案:

  • 将pods_frameworks.framework声明为链接中的可选项 二进制文件。
  • 尝试更改框架动态库的RunPath搜索路径
  • 安装名称运行pod deintegrate并再次运行pod install。
  • 删除派生数据和重新链接框架都会导致相同 问题。

有效的解决方案:

我意识到MyFramework.framework试图在错误的目录中找到Alamofire.framework,并且总是尝试使用框架搜索相对于项目/目标。因此,我能找到的最简单的解决方案是修改pod文件,如下所示。

platform :ios, '9.0'
use_frameworks!

workspace 'CocoaPodsProjectworkspace'

def shared_pods
    pod 'Alamofire'
    pod 'SwiftyJSON'
end

target 'CocoaPodsProject' do
    project 'CocoaPodsProject.xcodeproj'
    shared_pods
    # Pods for CocoaPodsProject
end

target 'MyFramework' do
    project 'MyFramework/MyFramework.xcodeproj'
    shared_pods
end

target 'CocoaPodsProjectTests' do

end

target 'CocoaPodsProjectUITests' do

end 

正如您所看到的,我将shared_pods添加到主应用程序和我的框架项目及其各自的目标。现在一切顺利。我既不需要pods_framework可选,也不必修改MyFramework的构建设置。

问题:

将共享存储库添加到想要使用我的框架的所有项目及其目标看起来并不多余。有没有更好的方法我可以指定Myframework.framework来读取所有依赖项而不是使用它来读取项目?

我在CocoaPods Git repo上提出了同样的问题。但是因为它本身并不是一个问题,所以它们可能不会回归。因此,将其作为问题发布在此处。如果有帮助,请发布:https://github.com/CocoaPods/CocoaPods/issues/6901

1 个答案:

答案 0 :(得分:0)

通过为我的自定义框架创建一个cocoa pod并使用cocoa pods依赖来解决它。

步骤1:清除主/父项目

  • 从项目中删除了MyFramework(已添加为sub 项目)并删除在嵌入式项目库中添加的MyFramework.framework常规设置。
  • 运行pod deintegrate(将已添加的广告已取消集成到 项目)
  • 现在项目很干净,没有添加任何pod 通过运行pod init
  • 初始化pod

第2步:为我的框架创建一个Pod

  • 使用cd命令导航到MyFramework项目,并在您进入后 MyFramework的根文件夹运行pod spec create MyFramework
  • 这将在。中创建一个名为MyFramework.podspec的文件 MyFramework的根文件夹。使用任何一个打开MyFramework.podspec 编辑器工具并按照教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial

  • 中的说明进行更新
  • 本教程中没有的最重要步骤是如何添加 我们的框架需要构建的可可pod依赖项。结果 这是最容易的部分。就我而言,我需要SwiftyJSONAlamofire所以在我添加的.podspec文件中,

  

s.dependency'Alamofire'

     

s.dependency'SwiftyJSON'

第3步:

  • 现在打开主/父项目Podfile并按如图所示进行更新 下方。
target 'CocoaPodsProject' do
  use_frameworks!
  pod 'TestFramework', :path => 'TestFramework/'
end

它做的是,它告诉主项目将TestFramework添加为依赖项并在主项目的Framework文件夹中安装TestFramework。因为TestFramework本身依赖于Alamofire& SwiftyJSON当您运行pod install时,它不仅会安装Alamofire,还会安装SwiftyJSON并将其添加到TestFramework's Framework文件夹。

多数民众赞成。现在,您的TestFramework可以访问AlamofireSwiftyJSON,主要/专利项目可以访问TestFramework

如果你想现在更新TestFramework代码,直到你完成开发将它作为子项目添加到Main项目(这是必要的,因为如果你打开TestFramework.xcproj你将看不到Alamofire / Swifty JSON。你必须打开Parent项目的工作空间本身因此这个解决方案)。一旦你完成开发,如果你决定删除TestFramework作为子项目,你可以这样做:)

最后如果你决定为app增加额外的扩展,让我们说你添加今天的扩展,你所要做的就是修改你的Podfile,如下所示。

target 'CocoaPodsProject' do
  use_frameworks!
  pod 'TestFramework', :path => 'TestFramework/'
end

target 'CocoapodsToday' do
  use_frameworks!
  pod 'TestFramework', :path => 'TestFramework/'
end

Woo hooo :)现在将您的框架添加到您想要的任意数量的扩展中:)希望它有所帮助。