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

问题:

这是我的项目结构。

ios - 这是使用嵌入式 cocoa  pod 创建动态/嵌入式框架的正确方法吗?-LMLPHP

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引用自:
/用户/ sandeep /库/开发人员/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework
原因:找不到图片

我尝试过的解决方案:
  • 在链接中声明pods_frameworks.framework为可选
    二进制文件。
  • 尝试更改框架动态库的RunPath搜索路径
  • 安装名称正在运行的pod分解并再次运行pod安装。
  • 删除派生数据和重新链接框架都导致相同
    问题。

  • 有效的解决方案:

    我意识到MyFramework.framework试图在错误的目录中找到Alamofire.framework,并且一直试图使用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仓库上提出了同样的问题。但是,因为这并不是天生的问题,所以他们可能不会恢复原状。因此,将其作为问题发布在此处。如果有帮助,请链接到https://github.com/CocoaPods/CocoaPods/issues/6901

    最佳答案

    通过为我的自定义框架创建可可豆荚并使用可可豆荚依赖关系来解决此问题。

    步骤1:清理主/父项目

  • 从项目中删除了MyFramework(已作为子项添加
    项目),然后删除在项目的嵌入式库中添加的MyFramework.framework常规设置。
  • 运行pod deintegrate(去整合已经添加到其中的pod
    专案)
  • 现在,该项目很干净,没有添加任何容器
    通过运行pod init
  • 初始化pod

    步骤2:为我的框架ojid_rstrong创建一个Pod
  • 使用cd命令导航到MyFramework项目,然后进入
    MyFramework的根文件夹运行pod spec create MyFramework
  • 这将在目录中创建一个名为MyFramework.podspec的文件。
    MyFramework的根文件夹。使用以下任意一种打开MyFramework.podspec
    编辑器工具并按照教程https://www.raywenderlich.com/126365/ios-frameworks-tutorial
  • 所示进行更新
  • 本教程中没有的最重要步骤是如何添加
    我们的框架需要构建的可可豆荚依赖关系。原来
    多数民众赞成在最简单的部分。就我而言,我需要SwiftyJSONAlamofire,所以我在.podspec文件中添加了

  • s.dependency“Alamofire”

    s.dependency'SwiftyJSON'

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

    它所做的是,它告诉主项目添加TestFramework作为依赖项,并将TestFramework安装在主项目的Framework文件夹中。由于TestFramework本身在运行Alamofire时具有对SwiftyJSONpod install的依赖关系,因此它不仅会安装Alamofire,还会安装SwiftyJSON,并将其添加到TestFramework's Framework文件夹中。

    就这样。现在您的TestFramework可以访问AlamofireSwiftyJSON,并且Main / Patent项目可以访问TestFramework
    如果现在要更新TestFramework代码,请在完成开发之前将其作为子项目添加到Main项目中(这是必要的,因为如果打开TestFramework.xcproj,您将看不到Alamofire / Swifty JSON。必须打开父项目的工作区本身因此此解决方案)。一旦完成开发,如果您决定删除TestFramework作为子项目,则可以执行此操作:)

    最后,如果您决定向应用程序添加其他扩展名,可以说您添加“今天”扩展名,您要做的就是如下修改ur Podfile。
    target 'CocoaPodsProject' do
      use_frameworks!
      pod 'TestFramework', :path => 'TestFramework/'
    end
    
    target 'CocoapodsToday' do
      use_frameworks!
      pod 'TestFramework', :path => 'TestFramework/'
    end
    

    哇哦:)现在,将您的框架添加到所需的许多扩展中:)希望能有所帮助。

    09-18 04:37