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

标签 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

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

dyld: Library not loaded: .framework/Alamofire Referenced from: /Users/sandeep/Library/Developer/Xcode/DerivedData/CocoaPodsProjectworkspace-enpobdyluhbxdwazuvbfogcspfof/Build/Products/Debug-iphonesimulator/MyFramework.framework/MyFramework Reason: image not found

我尝试过的解决方案:

  • 在链接中将 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 的build设置。

问题:

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

我在 CocoaPods Git 存储库上提出了同样的问题。但因为这不是天生的问题,他们可能不会退缩。因此将其作为问题发布在这里。问题链接:https://github.com/CocoaPods/CocoaPods/issues/6901如果有帮助。

最佳答案

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

第 1 步:清理主/父项目

  • 从项目中删除了 MyFramework(添加为子 项目)并删除在嵌入式项目库中添加的 MyFramework.framework 常规设置。
  • 运行pod deintegrate(去集成已经添加到
    的pod 项目)
  • 现在项目是干净的并且没有添加任何 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 中所示更新它

  • 本教程中没有的最重要的步骤是如何添加 我们的框架需要构建的 cocoa pod 依赖项。原来 那是最简单的部分。在我的例子中,我需要 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 & SwiftyJSON 当你运行 pod install 它不仅会安装 Alamofire 而且还会安装 SwiftyJSON 并将其添加到 TestFramework 的 Framework 文件夹中。

就是这样。现在您的 TestFramework 可以访问 AlamofireSwiftyJSON 并且 Main/Patent 项目可以访问 TestFramework

如果你现在想更新 TestFramework 代码,直到你完成开发,将它作为子项目添加到主项目(这是必要的,因为如果你打开 TestFramework.xcproj,你将看不到 Alamofire/Swifty JSON。你必须打开 Parent项目的工作区本身因此这个解决方案)。完成开发后,如果您决定删除 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 :) 现在将您的框架添加到您想要的任意多个扩展中 :) 希望对您有所帮助。

关于ios - 这是使用嵌入式 cocoa pod 创建动态/嵌入式框架的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45319504/

相关文章:

swift - 修剪后无法在相机胶卷中显示视频

ios - 给定一个 podspec 文件,我该怎么做才能将它包含在我的项目中?

xcode - 我怎样才能摆脱错误消息 "Ambiguous use of internal linkage declaration ' .. .' defined in multiple modules"

ios - 如何防止iTunes Connect上的应用程序名称丢失

cocoa-touch - 如何创建默认状态为 "back"的 UINavigationController?

ios - 尝试从左上角缩放 View

ios - iOS Swift 3 中来自对象的 JSON 存在数组问题

ios - 如何只在 viewDidAppear 中做一些事情?

ios - AutoID 的 Swift Firebase 数据库数组

ios - "~>"在cocoapods中的用途是什么