【问题标题】:Is this the correct way to create dynamic/embedded framework with embedded cocoa pods?这是使用嵌入式可可豆创建动态/嵌入式框架的正确方法吗?
【发布时间】:2018-01-01 08:04:38
【问题描述】:

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

问题:

这是我的项目结构。

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

在构建框架时,我将其作为嵌入式二进制文件拖到我的主项目中时出现错误。

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

我尝试过的解决方案:

  • 在链接中将 pods_frameworks.framework 声明为可选 二进制文件。
  • 尝试更改框架动态库的 RunPath Search 路径
  • 安装名称 Running 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 如果有帮助。

【问题讨论】:

    标签: ios swift3 cocoapods embedded-framework


    【解决方案1】:

    通过为我的自定义框架创建一个可可豆荚并使用可可豆荚依赖项解决了这个问题。

    第 1 步:清理主/父项目

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

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

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

    • 本教程中没有的最重要的步骤是如何添加 我们的框架需要构建的 cocoa pod 依赖项。原来 这是最简单的部分。就我而言,我需要SwiftyJSONAlamofire 所以在我添加的 .podspec 文件中,

    s.dependency 'Alamofire'

    s.dependency 'SwiftyJSON'

    第 3 步:

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

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

    仅此而已。现在您的TestFramework 可以访问AlamofireSwiftyJSON 并且主/专利项目可以访问TestFramework

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

    最后,如果您决定向应用程序添加其他扩展,假设您添加 Today 扩展,您所要做的就是修改您的 Podfile,如下所示。

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

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

    【讨论】:

    • 我遇到了类似的问题,我需要将 firebase 框架添加到我的框架中,并解决它的创建问题。您能否提供更多有关它的详细信息?
    猜你喜欢
    • 2022-07-28
    • 1970-01-01
    • 2011-08-31
    • 2011-11-29
    • 1970-01-01
    • 2013-05-17
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多