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

时间:2020-02-14 08:53:32

标签: ios swift cocoapods

我正在实现一个用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

但无法编译。

那么正确的方法是什么?还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

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

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