Cocoapods - Swift 具有内部静态库依赖性的框架

Cocoapods - Swift framework with internal static library dependency

我正在实施基于 Swift 编写的 iOS 框架。该框架内部依赖于基于 C 的静态库。为了让它工作并基于一些教程,我制作了一个类似于这样的模块映射:

framework module Module {
    umbrella header "Module.h"

    explicit module ModuleDep {
        private header "header1.h"
    }

    export *
}

基于此,我可以像这样在 Swift 中包含 C 代码:

import Module.ModuleDep

当手动导出框架时,一切似乎都运行良好。可以肯定的是,我希望 Cocoapods 支持我的框架并具有代码可见性(更易于调试)。使它起作用的 podspec 是这样的(省略了一些部分):

Pod::Spec.new do |s|
  s.platform = :ios
  s.ios.deployment_target = '12.0'

  s.module_map = "Module.modulemap"
  s.source_files = "Module/*.{h,swift}", "ModuleDep/*.h"
  s.vendored_libraries  = "ModuleDep/*.a"

  s.swift_version = "5.1"
end

根据我的理解,当这是您提供给用户的工件时使用 vendored_libraries,这就是我不喜欢这个解决方案的原因。

我也试过这个规格变体:

Pod::Spec.new do |s|
  s.platform = :ios
  s.ios.deployment_target = '12.0'

  s.module_map = "Module.modulemap"
  s.source_files = "Module/*.{h,swift}", "ModuleDep/*.h", "ModuleDep/*.a"  
  s.swift_version = "5.1"
end

但它无法编译。

那么正确的做法是什么?或者我做错了什么?

由于您使用静态库作为依赖项,因此您必须在 podspec 文件中将其指定为库。这就是为什么您的第二种方法不起作用的原因,因为它是库而不是源文件。

docs vendored_libraries 中所述,适用于 Pod 附带的库。同样在您的情况下,基于 C 的静态库是必须随 Pod 一起提供的依赖项。因此,在您的情况下使用 vendored_libraries 应该没问题。