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

San*_*ari 2 ios cocoapods swift3 embedded-framework

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

问题 :

这是我的项目结构。

在此输入图像描述

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

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

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

我尝试过的解决方案:

  • 在链接的二进制文件中将 pods_frameworks.framework 声明为可选。
  • 尝试更改框架动态库的 RunPath Search 路径
  • 安装名称 运行 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 
Run Code Online (Sandbox Code Playgroud)

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

问题:

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

我在 CocoaPods Git 存储库上提出了同样的问题。但因为这本质上不是一个问题,所以他们可能不会恢复原样。因此,将其作为问题发布在这里。问题链接: https: //github.com/CocoaPods/CocoaPods/issues/6901(如果有帮助)。

San*_*ari 6

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

第 1 步:清理主/父项目

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

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

  • 使用 cd 命令导航到 MyFramework 项目,进入 MyFramework 的根文件夹后运行pod spec create MyFramework
  • 这将在 MyFramework 的根文件夹中创建一个名为 MyFramework.podspec 的文件。使用任何编辑器工具打开 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
Run Code Online (Sandbox Code Playgroud)

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

就这样。现在您的 TestFramework 可以访问Alamofire并且SwiftyJSONMain/Patent 项目可以访问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
Run Code Online (Sandbox Code Playgroud)

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